首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在使用ffmpeg处理时流mkv文件

在使用ffmpeg处理时流mkv文件
EN

Stack Overflow用户
提问于 2019-04-01 17:12:25
回答 1查看 5.1K关注 0票数 3

我想做的事:

  • 我想在Firefox中播放一个mkv视频。
  • 但是Firefox不支持mkv格式。

因此,我搜索了很多,发现,我可以流,而不是按照这些步骤播放视频。

  • 可以使用m3u8将mkv转换为FFmpeg。
  • m3u8指向ts段文件
  • 然后在浏览器端使用hls.js播放视频。

但问题是,我想以编程的方式来完成这个任务。

我真正想做的事:

步骤

  • 客户端将一个巨大的(>1GB) mkv文件上传到客户机的服务器(服务器是客户机的机器本身)
  • 上传完成后,
  • 客户端请求播放视频。
  • 服务器开始转码,并立即向客户端发送m3u8流,而不是让客户端等待转码完成。
  • 客户应该能够找到视频。(最重要的部分)

这是可能的,因为艾比Plex都已经实现了它。

我能够让这个工作在铬,因为它支持播放一些mkv文件。我编写了一个节点js服务器,它接受Range头和视频的伪流。

要点

但是正如我提到的,Firefox拒绝mkv。

所以我尝试了hls,但我无法完全获得生成流的命令,也无法执行任务。

我是从命令行开始的

代码语言:javascript
运行
复制
ffmpeg -i ../stream.mkv -hls_list_size 0 -acodec copy -vcodec copy file.m3u8

和另一个shell实例上的一个简单http-server

我的index.html文件

代码语言:javascript
运行
复制
<html>
    <title>Welcome</title>
    <body>
        <script src="./hls.js"></script>
        <video id="video" width="400" controls></video>
        <script>
            var video = document.getElementById('video');
            if(Hls.isSupported()) {
                var hls = new Hls();
                hls.loadSource('file.m3u8');
                hls.attachMedia(video);
                hls.on(Hls.Events.MANIFEST_PARSED,function() {
                    video.play();
                });
            } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
                video.src = 'file.m3u8';
                video.addEventListener('loadedmetadata',function() {
                    video.play();
                });
            }
        </script>
    </body>
</html>

当它运行时,我继续请求服务器。

我得到了视频,但它只是寻求它被转换成ts文件。

它是随机的,视频长度也在不断增加。它有时不会播放,在FFmpeg完成转换为m3u8之后,如果我刷新网页,就会播放视频。

我认为这与m3u8文件的持续覆盖有关。是否有方法预先确定m3u8的文件内容并填充它?

我想要能够寻求更远,并以某种方式衍生出另一个FFmpeg进程,从视频的时间戳开始?我怎么才能接近寻找的部分呢?

所以我想再做一次

  • 我想请求服务器播放一个视频文件。
  • 它生成一个执行转码的子进程FFmpeg。
  • 将流发送给客户端
  • 客户应该能够寻求到最后,它应该发挥的东西。
EN

回答 1

Stack Overflow用户

发布于 2019-04-01 21:29:03

这个问题其实是很困难的。Plex之所以能够作弊,是因为文件是专门为每个用户打包的,而且在大部分情况下,plex控制着播放器。

Plex的基本工作方式是:

对文件进行预分析,并生成完整的清单。Transcode在文件开始时被踢开,并在本地缓存段。如果发生了查找(请求不本地缓存的段),则转换代码将被取消,在请求段的偏移量处启动一个新的on,并且播放机使其缓存的任何段无效。

如果客户端缓存段没有失效,或者使用了CDN,则无法保证第一个post used段将与稍后生成的前一个段对齐。这将导致边界跳过和弹出。

例如,在电影中寻找1小时的时间,而不是跳回30秒。这两个片段是按错误的顺序创建的,不能连续播放。

如果您需要支持架上播放机和光盘,问题是更困难的,因为你必须能够在飞行中生成准确的帧段。帧准确的音频是棘手的,特别是与编解码使用启动样本。我建议您研究一下基本做到这一点的商业服务,比如mux.com

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55460359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档