如何使用flutter video_player播放mkv文件?

问题描述 投票:0回答:1

我正在尝试使用播放 .mkv 文件。 flutters video_player 和 api 链接。当我尝试播放 mp4 视频时它可以工作,但是当我播放 mkv 视频时它给我错误:

[错误:flutter/runtime/dart_vm_initializer.cc(41)] 未处理的异常:PlatformException(VideoError,无法加载视频:无法打开,null,null)

这是我当前的代码:

import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';

class VideoPlayerTestScreen extends StatefulWidget {
  final String videoUrl;
  final String username;
  final String password;
  final String streamId;
  final String containerExtension;

  const VideoPlayerTestScreen({
    required this.videoUrl,
    required this.username,
    required this.password,
    required this.streamId,
    required this.containerExtension,
    Key? key,
  }) : super(key: key);

  @override
  _VideoPlayerTestScreenState createState() => _VideoPlayerTestScreenState();
}

class _VideoPlayerTestScreenState extends State<VideoPlayerTestScreen> {
  late VideoPlayerController _controller;

  @override
  void initState() {
    super.initState();
    print('Final Video URL: ${widget.videoUrl}'); // Print the final URL
    _controller = VideoPlayerController.networkUrl(
      Uri.parse(widget.videoUrl),
      httpHeaders: {}, 
    )..initialize().then((_) {
      setState(() {});
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Video Demo'),
      ),
      body: Center(
        child: _controller.value.isInitialized
            ? AspectRatio(
                aspectRatio: _controller.value.aspectRatio,
                child: VideoPlayer(_controller),
              )
            : Container(),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            _controller.value.isPlaying
                ? _controller.pause()
                : _controller.play();
          });
        },
        child: Icon(
          _controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
        ),
      ),
    );
  }

  @override
  void dispose() {
    super.dispose();
    _controller.dispose();
  }
}

当我在浏览器中输入 mp4 文件的 api url 时,它会直接在页面上显示视频。但对于 .mkv 文件,它会将文件下载到我的电脑,而不是在页面上显示它。

我尝试在 stackoverflow、google 搜索和 github 上搜索。尚未找到任何帮助解决方案。

flutter dart flutter-dependencies flutter-video-player
1个回答
0
投票

.mkv 只是一种容器格式,支持还取决于其中使用的编解码器 - 文件是 .mkv,但视频可以编码为 H.264、H.265、VP9 等

video_player 包包含指向支持的格式的链接。

支持的格式

在 iOS 和 macOS 上,支持播放器是 AVPlayer。支持的格式根据iOS版本而有所不同,AVURLAsset类有 您可以查询支持的av 格式的audiovideoTypes。

在 Android 上,后台播放器是 ExoPlayer,请参阅此处了解支持的格式列表。

在 Web 上,可用格式取决于用户的浏览器(供应商和版本)。检查 package:video_player_web 了解更多具体信息 信息。

还有另一个专门针对支持的 iOS 格式的答案。

ExoPlayer支持的格式确实包括 Matroska (mkv),因此它应该可以在 Android 上运行。

支持的网络格式将取决于您使用的浏览器。

如果视频尚未编码为 H.264,我会重新编码,以便它在浏览器之间具有最大的兼容性。

© www.soinside.com 2019 - 2024. All rights reserved.