ffmpeg rtsp(h264、acc)录制为mp4

说明

  1. 主流IPC的RTSP视频流(含麦克风音频)拉流操作,需要录制一段视频的情况,保存为mp4容器。
    海康RTSP音视频设置
    海康RTSP音视频设置

  2. 在网上找的资料还是比较多的其实,但是大部分都是ffmpeg比较低的4.x版本,新版本API不适用。

  3. 本例参考了其他的博客以及ffmpeg官方5.1的Example中muxing.c的例子。ffmpeg官方提供的示例也有其他文章进行了详细的分析,本文不再阐述,官方的例子中是包含一些编码的操作在里面的,不需要的情况下可以适当的删减。

  4. 文末附源码地址

流程

  1. 初始化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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值