MP4文件起播慢原因
我们在做录制的时候,会遇到这样的问题,有的开发者会把直播录制的mp4文件,用来做点播之用,这时候,会发现需要文件下载下来,才可以正常播放,也就我们常说的起播比较慢。
这个问题产生的原因,是因为源视频的moov(音视频数据索引)在mdat(音视频数据)之后造成的,为什么会出现这种情况呢?因为直播流,一般是最后些moov信息。
如何处理MP4文件?
可以通过转码源视频将moov移到mdat之前,以加快播放解析:
代码语言:javascript复制ffmpeg -i in.mp4 -movflags faststart out.mp4
如何查看moov和mdat?方便一些,可以直接用ffmpeg命令或Mp4Info类似的工具:
如果用ffmpeg查看:
用mp4info工具直接打开文件查看:
直播录制下来的文件,如果需要做这样的转换,如何处理?
以大牛直播SDK的Windows RTSP|RTMP播放器(SmartPlayer)为例,页面点击“录像”按钮后,开始录像和一个文件录制完成,我们都会有录像事件回调上来,如果需要将moov移到mdat之前,那么,可以在单个文件写入完成后,调用ffmpeg,直接从做转换,生成新的文件即可。
对应的录像状态回调事件如下:
代码语言:csharp复制/*
* SmartPlayerForm.cs
* Author: daniusdk.com
* WeChat: xinsheng120
*/
private void RecordCallBack(UInt32 status, [MarshalAs(UnmanagedType.LPStr)] String file_name)
{
byte[] utf8_bytes = Encoding.Default.GetBytes(file_name);
byte[] default_bytes = Encoding.Convert(Encoding.UTF8, Encoding.Default, utf8_bytes);
String recorder_file_name = Encoding.Default.GetString(default_bytes);
StringBuilder sb = new StringBuilder();
sb.Append("录像状态:");
if (status == 1)
{
sb.Append("new file: ");
}
else if(status == 2)
{
sb.Append("finished file: ");
}
sb.Append(recorder_file_name);
MessageBox.Show(sb.ToString());
}
总结
以上是针对直播流录制起播慢的处理,如果录制下来的文件,需要做在线点播,这块非常必要,有问题或感兴趣的开发者,可以单独跟我沟通探讨。