这个命令生成init.mp4 +一堆m4s文件,我试图用MSE播放它们:
ffmpeg -i <input file> -f hls -hls_segment_type fmp4 -c:v copy playlist.m3u8
这是我正在使用的客户端代码:
var socket = io();
var video = document.querySelector('video');
var mimeCodec = 'video/mp4; codecs="avc1.64000d,mp4a.40.2"';
if ('MediaSource' in window && MediaSource.isTypeSupported(mimeCodec)) {
var mediaSource = new MediaSource;
video.src = URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', sourceOpen);
} else {
console.error('Unsupported MIME type or codec: ', mimeCodec);
}
function sourceOpen (_) {
var mediaSource = this;
var sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
sourceBuffer.mode = 'sequence';
socket.on('broadcast', function (newPiece) {
// here i'm getting the buffer of the video == buffer
sourceBuffer.addEventListener('updateend', function (_) {
video.play().then(function() { }).catch(function(error) { });
});
sourceBuffer.appendBuffer(buffer); // when the seconde video comes i append it's buffer
})
};
当我发送init.mp4
文件后跟playlist0.m4s, playlist1.m4s, playlist2.m4s, ....
时,一切正常。
但是当我尝试播放init.mp4
文件后紧跟6,7,8而不是0,1,2意味着playlist6.m4s, playlist7.m4s, playlist8.m4s, ....
时,它不起作用。
我不知道为什么,这应该是直播视频,从一开始就观看直播的观众得到init.mp4, playlist0.m4s, playlist1.m4s, playlist2.m4s, ....
。
5分钟后出现的人会得到类似init.mp4, playlist32.m4s, playlist33.m4s, playlist34.m4s, ....
之类的内容,等等,但到目前为止它仅适用于获取init.mp4, playlist0.m4s, playlist1.m4s, playlist2.m4s, ....
的查看器。视频无法播放给其他人
答案 0 :(得分:0)
如果您可以使用fMP4
代替webm
,则可以使用以下命令行生成合适的碎片MP4
(适用于低延迟):
ffmpeg -i <input file> -c:v libx264 -profile:v main -level 3.2 -pix_fmt yuv420p -b:v <bitrate> -preset medium -tune zerolatency -flags +cgop+low_delay -movflags empty_moov+omit_tfhd_offset+frag_keyframe+default_base_moof+isml -c:a aac <output file.mp4>
请务必使用最新版本。
您仍然需要解析生成的MP4
输出,以便使用moov
框向Web客户端发送初始化细分,并将moof+mdat
个框对作为MSE的细分视频。