开始写博客!!今天第一个:FFmpeg解码网络rtsp流的一般流程和这几天遇到的问题,尤其是avformat_input_open解析错误的网络串流长时间不返回!

原创 2014年09月26日 17:16:45
AVFormatContext* m_pFormatCtx;  

AVCodecContext * m_pCodecCtx;   

AVCodec* m_pCodec; 

AVFrame* m_pFrame; 

AVPacket m_AVPkt;

// 注册库
 av_register_all();
 avformat_network_init();  

//打开文件或者是网络串流
avformat_open_input(&m_pFormatCtx,pcURL,NULL,NULL);
/***************************************************************************************/
在函数avformat_open_input函数中,我们解析错误的网络缠流会出现函数长时间不返回的现象

要解决这个现象,我们需要在AVFromatContext结构体中为nterrupt_callback.callback赋回调函数,来保证打开流超时的情况下函数avformat_open_input能够正确
返回错误代码
回调函数示例:
int CRtpStreamCtlByFFMpeg::interrupt_cb(LPVOID ctx)
{
 /*AVFormatContext* formatContext =
  reinterpret_cast<AVFormatContext*>(ctx);*/

// CRtpStreamCtlByFFMpeg:解码类
// 该函数主要的思想就是在解码启动的时候获得启动时间(p->m_VideoInfoForShow.nLastTime 
// 然后判断程序是否已经获得流信息并开始接收流,也就是判断AVFormatContext中start_time参数是否已经有了大于0的值

 CRtpStreamCtlByFFMpeg* p = (CRtpStreamCtlByFFMpeg*)ctx;

 //timeout after 5 seconds of no activity
 if (p->m_pFormatCtx->start_time < 0)
 {
  p->m_pFormatCtx->start_time = 0;
 }
 if (p->m_pFormatCtx->start_time <= 0 && timeGetTime() - p->m_VideoInfoForShow.nLastTime >5000)
 {
  p->m_count = 0;
  return 1;
 }
 return 0;
}
/***************************************************************************************/



// 查找流的信息,从网络串流中找到我们需要的视频\音频流
avformat_find_stream_info(m_pFormatCtx,NULL)

// 查找解码解码器
avcodec_find_decoder(m_pCodecCtx->codec_id)

// 打开解码器
avcodec_open2(m_pCodecCtx, m_pCodec,NULL)

// 为帧申请内存
m_pFrame = avcodec_alloc_frame();

// 从文件\网络串流中读取数据帧
av_read_frame(pC->m_pFormatCtx, &AvPkt)

// 解码,got_picture 的值表示解码是否成功,成功为1,失败为0
 avcodec_decode_video2(m_pCodecCtx, m_pFrame, &got_picture, &avPkt)

/***************************************************************************************/
至此,使用FFmpeg打开文件\网络串流、接收数据,解码的工作已经全部完成,但要注意的是
FFMpeg默认解码h264数据位YUV420格式,如果需要将YUV420数据转换到RGB24数据,则需要
使用sws函数组
/***************************************************************************************/

// 首先为一个AVFrame申请内存
pFrameRGB=avcodec_alloc_frame();

// 获得YUV420格式帧的大小
nRGBSize = avpicture_get_size(PIX_FMT_RGB24, m_pCodecCtx->width, m_pCodecCtx->height);

// 填充新申请的RGB数据帧
avpicture_fill((AVPicture *)pFrameRGB, out_buffer, PIX_FMT_RGB24, m_pCodecCtx->width, m_pCodecCtx->height);

// 获得swsContext
img_convert_ctx = sws_getContext(m_pCodecCtx->width, m_pCodecCtx->height, m_pCodecCtx->pix_fmt,\
     m_pCodecCtx->width, m_pCodecCtx->height, PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL); 

// 转码
sws_scale(img_convert_ctx, (const uint8_t* const*)m_pFrame->data, m_pFrame->linesize, 0, m_pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize); 

//释放swsContext
sws_freeContext(img_convert_ctx);     //这一步非常重要,如果不将swsContext释放掉,就会造成内存泄露

ffmpeg连接超时与解码超时

ffmpeg超时时间应该有两个,连接超时时间和解码超时时间
  • jacke121
  • jacke121
  • 2017年01月14日 18:03
  • 2232

ffmpeg设置tcp,连接时间,解码格式

pFormatCtx = avformat_alloc_context(); AVDictionary* options = NULL; av_dict_set(&options, "rtsp...
  • jacke121
  • jacke121
  • 2017年01月14日 18:00
  • 1485

标准RTSP 消息的错误代码

标准RTSP消息的错误代码–在应答消息的第一行表示 ”100” ; Continue (all 100 range) “110”; Connect Timeout  “200” ; OK...
  • ameyume
  • ameyume
  • 2012年04月09日 15:05
  • 7816

解决ie无法打开rtsp协议链接

这是realplayer没设置好的缘故。 我们需要在媒体类型中重新设置一下。两种选择,一种是使realplayer成为通用媒体播放器,第二种手动配置媒体类型中选中下面的流媒体类型。helix serv...
  • james05y
  • james05y
  • 2006年11月18日 12:31
  • 3603

FFmpeg长时间无响应的解决方法

需要解决的问题 1、FFmpeg去连接的时候相机不在线导致avformat_open_input等函数一直死等,造成程序卡死 2、av_read_frame的过程中相机断开连接导致读取码流...
  • sz76211822
  • sz76211822
  • 2016年08月30日 15:40
  • 4732

avformat_open_input超时问题

fmpeg用avformat_open_input()解析网络流时,默认是阻塞的。 当遇到解析错误的网络流时,会导致该函数长时间不返回。 为此可以设置ffmpeg的-stimeout 的参...
  • qq_16844001
  • qq_16844001
  • 2016年10月28日 18:37
  • 1478

ffmpeg设置avformat_open_input( )超时 -stimeout

ffmpeg用avformat_open_input()解析网络流时,默认是阻塞的。 当遇到解析错误的网络流时,会导致该函数长时间不返回。 为此可以设置ffmpeg的-stimeout 的...
  • zqf_office
  • zqf_office
  • 2016年03月12日 10:03
  • 1321

ffmpeg avformat_open_input返回失败的解决办法

很多朋友在使用新版本的ffmpeg时,都遇到了avformat_open_input返回失败的问题。 在下也遇到了此问题。在stackoverflow上搜了一下,解决方法如下。 在调用av...
  • crazycoder8848
  • crazycoder8848
  • 2014年02月21日 14:10
  • 14346

ffmpeg avformat_open_input返回失败的解决办法

很多朋友在使用新版本的ffmpeg时,都遇到了avformat_open_input返回失败的问题。 在下也遇到了此问题。在stackoverflow上搜了一下,解决方法如下。 ...
  • weiyuefei
  • weiyuefei
  • 2016年06月15日 17:46
  • 1554

ffmpeg调用 avformat_open_input失败,返回 -2

系统环境ubuntu12.04,开发环境Qt 执行程序卡在如下代码段: if(avformat_open_input(&pFormatCtx,filepath,NULL,NULL)!=0){/...
  • Bobsweetie
  • Bobsweetie
  • 2016年03月20日 12:39
  • 3724
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:开始写博客!!今天第一个:FFmpeg解码网络rtsp流的一般流程和这几天遇到的问题,尤其是avformat_input_open解析错误的网络串流长时间不返回!
举报原因:
原因补充:

(最多只允许输入30个字)