qt下ffmpeg录制mp4经验分享,支持音视频(h264、h265,AAC,G

  MP4,是最常见的国际通用格式,在常见的播放软件中都可以使用和播放,磁盘空间占地小,画质一般清晰,它本身是支持h264、AAC的编码格式,对于其他编码的话,需要进行额外处理。本文提供了ffmpeg录制mp4的封装代码,经测试视频上它支持h264、h265编码,音频支持了AAC、G711的aLaw、muLaw编码。对于以上编码的支持,部分是需要修改ffmpeg的源码,本文也有提供已编译好的ffmpeg以及说明源码上需要修改的地方。

  在mp4录制中,有碰到一个问题,即在录制实时流后,用播放器进行播放,播放时间没有从0秒开始。windows自带的media play播放时,一开始都是静止的画面,从第n秒后,才开始正式播放,用VLC可以直接跳到n秒进行播放。这个问题的原因是时间戳没有处理好,需要记录下首帧,指定首帧时间戳为0,然后后续视频帧的时间戳等于当前帧的时间戳减去首帧时间戳。代码如下:

  在这里插入图片描述

  解码头信息是保存在解码器上下文(AVCodecContext)的extradata中,这些信息包含h264的SPS、PPS头信息,AAC的adts头信息,h265的VPS、SPS、PPS,我们需要使用比特流过滤器(AVBitStreamFilter)来为每一种格式添加相应的头部信息,这样才能在解码器中正常进行解码。以下为添加解码头信息的相关代码:

  初始化时视频:

  在这里插入图片描述

  循环读帧中,视频:

  在这里插入图片描述

  初始化时音频:

  在这里插入图片描述

  循环读帧中,音频:

  在这里插入图片描述

  在ffmpeg源码movenc.c文件中,找到mov_write_audio_tag函数,修改以下:

  在这里插入图片描述

  和在该文件中增加以下:

  在这里插入图片描述

  muLaw修改类似,它的MKTAG为 ‘u’,‘l’, ‘a’,‘w’。

  mp4recorder.h

  mp4recorder.cpp

  链接地址:https://download.csdn.net/download/linyibin_123/87542123