MP4文件起播慢原因

我们在做录制的时候,会遇到这样的问题,有的开发者会把直播录制的mp4文件,用来做点播之用,这时候,会发现需要文件下载下来,才可以正常播放,也就我们常说的起播比较慢。

这个问题产生的原因,是因为源视频的moov(音视频数据索引)在mdat(音视频数据)之后造成的,为什么会出现这种情况呢?因为直播流,一般是最后些moov信息。

如何处理MP4文件?

可以通过转码源视频将moov移到mdat之前,以加快播放解析:

ffmpeg -i in.mp4 -movflags faststart out.mp4
  • 1.

[建议收藏]RTSP|RTMP直播流录制下来的MP4文件起播慢怎么办?_mp4文件起播慢

如何查看moov和mdat?方便一些,可以直接用ffmpeg命令或Mp4Info类似的工具:

如果用ffmpeg查看:

[建议收藏]RTSP|RTMP直播流录制下来的MP4文件起播慢怎么办?_mp4文件点播慢_02

用mp4info工具直接打开文件查看:

[建议收藏]RTSP|RTMP直播流录制下来的MP4文件起播慢怎么办?_mdat和moov_03

直播录制下来的文件,如果需要做这样的转换,如何处理?

以大牛直播SDK的Windows RTSP|RTMP播放器(SmartPlayer)为例,页面点击“录像”按钮后,开始录像和一个文件录制完成,我们都会有录像事件回调上来,如果需要将moov移到mdat之前,那么,可以在单个文件写入完成后,调用ffmpeg,直接从做转换,生成新的文件即可。

[建议收藏]RTSP|RTMP直播流录制下来的MP4文件起播慢怎么办?_mdat和moov_04

对应的录像状态回调事件如下:

/*
 * SmartPlayerForm.cs
 * Author: daniusdk.com
 */
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());
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.

总结

以上是针对直播流录制起播慢的处理,如果录制下来的文件,需要做在线点播,这块非常必要,有问题或感兴趣的开发者,可以单独跟我沟通探讨。