使用ffmpeg

时间:2018-02-02 18:07:01

标签: video ffmpeg

这个命令生成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, ....的查看器。视频无法播放给其他人

1 个答案:

答案 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的细分视频。