【发布时间】:2018-07-13 07:10:14
【问题描述】:
这个命令产生 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, .... 的观众。该视频无法为其他人播放
【问题讨论】:
-
是否需要 WebM?如果没有,你可以试试 mp4/h.264。
-
@heff WebM 不是必需的,如果它是 mp4,只要它与 Media Source Extensions API 配合良好,就没有问题,如果你有一个工作示例,如果你把它作为答案,我将不胜感激
-
在这里查看我的答案stackoverflow.com/a/30643655/83169。您必须在客户端工作,以便您可以将
fMP4分块到moof+mdat段中。 -
@PabloMontilla 我在搜索时看到了您的答案,但我不明白,我是 ffmpeg 和 mse 的初学者,您能否发布您的意思作为答案的代码,谢谢