我想做的事:
因此,我搜索了很多,发现,我可以流,而不是按照这些步骤播放视频。
但问题是,我想以编程的方式来完成这个任务。
我真正想做的事:
步骤
我能够让这个工作在铬,因为它支持播放一些mkv文件。我编写了一个节点js服务器,它接受Range
头和视频的伪流。
但是正如我提到的,Firefox拒绝mkv。
所以我尝试了hls,但我无法完全获得生成流的命令,也无法执行任务。
我是从命令行开始的
ffmpeg -i ../stream.mkv -hls_list_size 0 -acodec copy -vcodec copy file.m3u8
和另一个shell实例上的一个简单http-server
我的index.html文件
<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进程,从视频的时间戳开始?我怎么才能接近寻找的部分呢?
所以我想再做一次
发布于 2019-04-01 21:29:03
这个问题其实是很困难的。Plex之所以能够作弊,是因为文件是专门为每个用户打包的,而且在大部分情况下,plex控制着播放器。
Plex的基本工作方式是:
对文件进行预分析,并生成完整的清单。Transcode在文件开始时被踢开,并在本地缓存段。如果发生了查找(请求不本地缓存的段),则转换代码将被取消,在请求段的偏移量处启动一个新的on,并且播放机使其缓存的任何段无效。
如果客户端缓存段没有失效,或者使用了CDN,则无法保证第一个post used段将与稍后生成的前一个段对齐。这将导致边界跳过和弹出。
例如,在电影中寻找1小时的时间,而不是跳回30秒。这两个片段是按错误的顺序创建的,不能连续播放。
如果您需要支持架上播放机和光盘,问题是更困难的,因为你必须能够在飞行中生成准确的帧段。帧准确的音频是棘手的,特别是与编解码使用启动样本。我建议您研究一下基本做到这一点的商业服务,比如mux.com。
https://stackoverflow.com/questions/55460359
复制相似问题