html - 如何实时转码 wmv 文件以在 html5 播放器中播放?
问题描述
我已经为此工作了很长时间,但仍然没有找到有效的解决方案。我需要一种实时转换(转码).wmv 文件以在 html5 网络播放器中播放的方法。
我有一个 linux 服务器 (Apache) 设置,可以通过专为 Chrome 和 Firefox 浏览器设计的 html5 网络播放器 (Video.js) 流式传输视频文件。我正在处理的文件类型是 .mp4 (H.264)、.mkv 和 .wmv。对我来说好消息是我可以原生处理 mp4 和 mkv,但是我不能播放 wmv。此外,我必须处理大量文件,定期更改,而且可能非常大。
在做了很多研究并阅读了很多次如何不能直接流式传输 wmv 之后,我意识到我有两种选择。将文件转换为支持的格式或实时转码文件以在网络播放器中使用。由于文件的数量及其大小(以及定期更改),转换文件根本不可行。所以我坚持使用直播/转码。我认为 ffmpeg 将是要走的路,但我还没有弄清楚如何让 ffmpeg 直播到 html5 播放器。
那么如何获取现有的 .wmv 文件并在 html5 播放器中进行直播呢?
到目前为止我尝试过的事情:
尝试创建一个 m3u8 播放列表并希望它能神奇地工作。
ffmpeg -i "hello.wmv" -s 640x480 -c:v libx264 -f ssegment -hls_flags delete_segments -segment_list playlist.m3u8 -segment_list_type hls -segment_list_size 10 -segment_list_flags +live -segment_time 10 out_%6d.ts
只需在 ffmpeg 仍在进行时复制到 mp4 和流式传输。显然没有奏效。
ffmpeg -i "hello.wmv" -vcodec copy video.mp4
在 ffmpeg 仍在进行时转换为 webm 格式和流式传输 webm。这实际上确实在 html 播放器中显示了几秒钟的视频:
ffmpeg -i "hello.wmv" -codec:a libvorbis -codec:v libvpx -b:a 128k -b:v 1200k video.webm
不需要使用ffmpeg(也在考虑vlc),需要html5播放器。完全转换然后流式传输不是一个可行的选择,因为文件大小可能太大并且会定期更改。我可以使用什么命令/程序来流式传输文件以在 html 播放器中播放?
解决方案
在尝试了很多不同的方法后,我终于想出了一个可行的解决方案。在这里张贴给将来可能遇到它的任何人。我最终得到的解决方案是使用 HLS(实时流)来分割文件。使用输出的 .m3u8 文件,然后我在我的 html5 播放器的视频标签中使用它。
以下是我在ffmpeg中使用的。请注意,我将预设设置为超快(因为我所看到的 libx264 非常慢)。我确信有更有效的参数可以与 ffmpeg 一起使用,我肯定会继续做更多的测试,但这被证实是有效的:
ffmpeg -i "hello.wmv" -preset ultrafast -c:v libx264 -f ssegment -hls_flags delete_segments -segment_list play_file.m3u8 -segment_list_type hls -segment_list_size 0 out_%6d.ts
在 html 视频标签中,只需使用:
<source src="play_file.m3u8" type="application/x-mpegURL">
对于将来可能遇到此问题的任何人请注意:如果您在使用 x-mpegURL 类型时遇到“文件不支持错误”,那么您的源 js 有问题。确保有 hls.js(在我的例子中是 videojs-contrib-hls.js),否则它会抛出错误。我花了很长时间才弄清楚实际上问题不是浏览器而是 html js。
我认为这个解决方案几乎适用于 ffmpeg 支持的任何视频类型。只需更改输入文件,如有必要,可能会弄乱编解码器。
推荐阅读
- python - Raspberry Pi 按钮 LED 随机触发器
- google-cloud-dataflow - 谷歌云构建 python apache 光束数据流 yaml 文件
- javascript - 使用ajax php后取消索引
- java - 如何在 Java 中的一行中输入时间?
- swiftui - 在我的 iOS 应用中的视图之间构建导航
- node.js - 将 \n 存储为文本而不是 linux 文件中的换行符?
- mysql - $ sudo service mysql restart 重启mysql.service失败:未找到单元mysql.service
- python - 具有基本身份验证的 python aiosmtpd 服务器
- c# - 集合已修改枚举操作在使用数据表和数据集时可能无法执行
- c++ - CMake File API“找不到回复目录”