开始写博客!!今天第一个: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处理RTMP流的总结

FFMpeg处理RTMP流有两种方式:   一个是使用自带的RTMP代码功能;   一个是使用第三方库librtmp; 下面就这两种方式的一些使用和差异做了个总结; 一、自带RTMP代码功...

ffmpeg设置avformat_open_input( )超时 -stimeout

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

ffmpeg学习(二) 通过rtsp获取H264裸流并保存到mp4文件

http://doc.okbase.net/wenjingu/archive/101505.html   顾文锦     2014-9-24 11:06:51     阅读(2128)     ...

ffmpeg RTSP流拉取

//.h文件 extern "C" {#include "libavformat/avformat.h"#include "libswscale/swscale.h"#include "libswre...
  • CDUT100
  • CDUT100
  • 2016年10月09日 19:27
  • 1205

FFMpeg分析:第一个函数avformat_open_input

在上篇文章中的demo中,main函数的流程里调用的第一个函数就是avformat_open_input()。直观看来,其最明显的功能就是制定了要播放的文件名了。但是除了问价名之外还有几个结构体作为了...

海康rtsp抓包分析

海康h264 rtp/rtsp/rtcp包分析 1、DESCRIBE rtsp://192.168.0.186:554/mpeg4/ch01/main/av_stream RTSP/1.0 CSe...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

ffmpeg摄像头采集h264编码RTP发送

一. 相关API说明 1. av_register_all 2. avformat_network_init 不管是流媒体发送还是流媒体接收, 需要先执行该函数. 3. avformat...
  • yTaoSky
  • yTaoSky
  • 2017年05月31日 14:56
  • 1141

ffmpeg 接收解码rtp h264视频流

首先说明一下nalu的格式:       nalu由三个部分组成:开始码(0x01000000)+nalu头+nalu数据。 使用live555 testrtspclient那个例子来接收rtp流...
  • ldpxxx
  • ldpxxx
  • 2015年09月25日 15:58
  • 2761

sdp详解

SDP文件解析   SDP是一个IETF标准格式,用来描述视频和/或者音频的RTP流。 会话描述协议(SDP)为会话通知、会话邀请和其它形式的多媒体会话初始化等目的提供了多媒体会话描述。 会话目录用...
  • xyblog
  • xyblog
  • 2015年11月09日 17:11
  • 11054
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:开始写博客!!今天第一个:FFmpeg解码网络rtsp流的一般流程和这几天遇到的问题,尤其是avformat_input_open解析错误的网络串流长时间不返回!
举报原因:
原因补充:

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