用FFmpeg实现的RTMP接收类

本文介绍了如何使用FFmpeg实现RTMP接收功能,包括初始化和打开流,设置超时机制,获取流信息,接收和分离流,处理H264和AAC数据,解码视频和音频,以及资源释放。示例代码中展示了具体的实现细节,例如使用bitstream filter转换H264数据,并插入ADTS头处理AAC音频。
摘要由CSDN通过智能技术生成

      现在很多直播都用到RTMP来传输,而接收RTMP用FFmpeg比较常见(当然也有用其他库的)。FFmpeg对RTMP接收有比较完善实现了,API使用方法也很简单,大多数流程跟文件流处理一样,但是一些区别的地方。下面大概说一下用FFmpeg怎么实现RTMP接收功能,后面再附上封装类的代码。

1.  初始化和打开流。

 这是第一步要做的工作,打开了流后才能往下接收数据,打开流需要调用FFmpeg的API avformat_open_input函数,这个函数连接网络的时候会阻塞的,所以要设置超时值,否则有时候会阻塞很久时间。怎么设置超时时间?

   AVDictionary* options = nullptr;   
    av_dict_set(&options, "stimeout", "3000000", 0);  //设置超时断开连接时间  

上面两行代码设置了连接的超时时间为3秒,但是我试过了,到了超时时间函数还没有返回,好像是FFmpeg的问题。但没有关系,另外我们还有一种方法检测超时,就是通过异常回调函数,avformat_open_input函数可以传入一个回调函数地址作为参数,如果发生连接超时、接收超时,可以直接在回调函数里通知,这样可以使avformat_open_input函数马上返回,避免阻塞太久。

下面是打开流的代码:

BOOL RtmpStreamSession::openInputStream()
{
    int res = 0;

    bool bIsNetPath = false;

	if(_strnicmp(m_InputUrl.c_str(), "rtsp://", 7) == 0 || _strnicmp(m_InputUrl.c_str(), "RTSP://", 7) == 0)
	{
		bIsNetPath = true;
	}
	else if(_strnicmp(m_InputUrl.c_str(), "rtmp://", 7) == 0 || _strnicmp(m_InputUrl.c_str(), "RTMP://", 7) == 0)
	{
		bIsNetPath = true;
	}
	else
	{
		bIsNetPath = false;
	}

	if(bIsNetPath) //从网络接收
	{
		//Initialize format context
		m_inputAVFormatCxt = avformat_alloc_context();

		//Initialize intrrupt callback
		AVIOInterruptCB icb = {interruptCallBack,this};
		m_inputAVFormatCxt->interrupt_callback = icb;
	}


	m_dwLastRecvFrameTime = 0;
	m_dwStartConnectTime = GetTickCount();

	//m_inputAVFormatCxt->flags |= AVFMT_FLAG_NONBLOCK;

    AVDictionary* options = nullptr;   
    av_dict_set(&options, "stimeout", "3000000", 0);  //设置超时断开连接时间  

	//m_inputAVFormatCxt->max_analyze_duration = 2000000;
    // m_inputAVFormatCxt->fps_probe_size = 30;

    res = avformat_open_input(&m_inputAVFormatCxt, m_InputUrl.c_str(), 0, &options);

    if(res < 0)
    {
        string strError = "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值