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

2024-09-05 15:41:14 浏览数 (3)

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());
}

总结

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

0 人点赞