我目前正在向Chrome发送视频流,以通过MediaSource API播放 .
据我了解,MediaSource仅支持使用MPEG-DASH编码的MP4文件,或者支持以关键帧开头的集群的WebM文件(否则会引发错误:媒体段不以关键帧开头) .
有没有办法用FFMPEG实时编码MPEG-DASH或关键帧WebM格式?
Edit:
我只是用 ffmpeg ... -f webm -vcodec vp8 -g 1
尝试了它,所以每一帧都是一个关键帧 . 不是理想的解决方案 . 它现在可以与MediaStream一起使用 . 有没有办法将段与WebM中的关键帧同步,所以不是每个帧都需要是一个关键帧?
Reference Questions on WebM / MP4 and MediaSource:
Media Source Api not working for a custom webm file (Chrome Version 23.0.1271.97 m)
4 回答
要确保WebM中的每个群集都以关键帧开头,请尝试以下操作:
基本上,如实现的那样,每个关键帧必须位于集群的开头,但反之则不然 . 也就是说,在关键帧上会有一个新的集群,但在新集群上不一定会有一个关键帧 . 为了解决这个问题,我们只需将群集大小设置为我们永远不会达到的大小 .
在这个例子中,我们每隔2秒就会有一个关键帧,并且群集时间限制是2.1秒,所以我们永远不会命中它 . 比特率为4Mbit,簇大小限制为10M . 不确定它是否在那里有点或字节,但它没关系,因为我们永远不会打它,因为我设置它比它需要的大得多 .
目前FFMPEG不支持DASH编码 . 您可以使用FFMPEG(https://www.ffmpeg.org/ffmpeg-formats.html#segment_002c-stream_005fsegment_002c-ssegment)进行分段,但我建议将FFMPEG和MP4Box结合使用 . 使用FFMPEG转码您的实时视频,然后使用MP4Box分段并创建.mpd索引 .
MP4Box是GPAC(http://gpac.wp.mines-telecom.fr/)的一部分 .
以下是使用h264的示例:
如果您需要VP8(WebM),请使用:
-vcodec libvpx
和-f webm
或-f ts
.另一位用户有一些运气:
请参阅galbarm的问题:
Live streaming dash content using mp4box
Flush & Latency Issue with Fragmented MP4 Creation in FFMPEG
注意:如果输入视频中没有关键帧,则可能需要设置:
......而不是
+frag_keyframe
.当我试图通过 MediaRecorder API 使用 Media Source Extensions (MSE)播放录制的.webm文件时遇到了同样的情况 . Chrome(51)录音格式不正确,Firefox(46)似乎没问题 .
要使其正常工作,您必须修复.webm文件中的提示:
clone https://github.com/webmproject/libwebm
确保你有cmake版本> = 3.2(https://askubuntu.com/questions/610291/how-to-install-cmake-3-2-on-ubuntu-14-04)
cmake .
make
./sample_muxer -i original.webm -o fixed.webm
加载fixed.webm到DASH /你自己的播放器!
希望它有所帮助 . 没有DASH关键字谷歌任何信息是很困难的(我不使用DASH,只有相同的底层技术 - MSE):)