说明
-
主流IPC的RTSP视频流(含麦克风音频)拉流操作,需要录制一段视频的情况,保存为mp4容器。
-
在网上找的资料还是比较多的其实,但是大部分都是ffmpeg比较低的4.x版本,新版本API不适用。
-
本例参考了其他的博客以及ffmpeg官方5.1的Example中muxing.c的例子。ffmpeg官方提供的示例也有其他文章进行了详细的分析,本文不再阐述,官方的例子中是包含一些编码的操作在里面的,不需要的情况下可以适当的删减。
-
文末附源码地址
流程
- 初始化input,这个过程又包含:打开输入文件->查找音/视频流。其实整个过程是不包含任何编解码的操作的,所以就没有必要再去查找编解码器AVCodec以及AVCodecContext的,看了几篇博文中,都包含了,其实没有必要,因为mp4的容器格式兼容h264以及acc编码格式。
bool RtspSaveMp4::initInput(std::string inputName)
{
m_inFmtCtx = avformat_alloc_context();
int nRet=-1;
nRet = avformat_open_input(&m_inFmtCtx, inputName.c_str(), nullptr, nullptr);
if (nRet < 0)
{
COUT << "Open input file failed!" << std::endl;
return false;
}
nRet = avformat_find_stream_info(m_inFmtCtx,nullptr);
if (nRet < 0)
{
COUT << "Find input stream info failed!" << std::endl;
return false;
}
//查找视频流在文件中的位置 这里或者使用av_find_best_stream
for (size_t i = 0; i < m_inFmtCtx->nb_streams; i++) {
//nb_streams 视音频流的个数
if (m_inFmtCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
//streams 视音频流
m_inVideoIndex = i;
}
else if (m_inFmtCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
{
m_inAudioIndex = i;
}
}
m_inVideoStream = m_inFmtCtx->streams[m_inVideoIndex];
m_inAudioStream = m_inFmtCtx->streams[m_inAudioIndex];
// 打印输入输出流的信息
COUT << "-----------------Input Format Start--------------"<< std::endl;
av_dump_format