我正在尝试使用播放 .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 上搜索。尚未找到任何帮助解决方案。
.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,我会重新编码,以便它在浏览器之间具有最大的兼容性。