FFMPEG解码过程

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:解码类

// 然后判断程序是否已经获得流信息并开始接收流,也就是判断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释放掉,就会造成内存泄露

时间: 2024-10-10 08:25:04

FFMPEG解码过程的相关文章

ffmpeg解码音视频过程(附代码)

0. 引言 最近一直在使用和学习ffmpeg. 工作中需要拉流解码, 获取音频和视频数据. 这些都是使用ffmpeg处理. 因为对ffmpeg接触不多, 用的不深, 在使用的过程中经常遇到不太懂的地方, 就会花费很多时间去查阅资料. 所以自己对用到的知识点总结一下, 方便自己以后再重复用到时能够方便找到. 环境: ubuntu16.04, 已安装ffmpeg依赖库. gcc编译工具. ffmpeg解码过程中用到了两个很重要的结构体, 这两个结构体比较复杂, 用到的次数也非常多, 以后我单独写一篇

ffmpeg强化一:编解码过程,基本用法

1  术语: 什么是影片?其实就是一组(很多张)图片,时间间隔很小的连续展示出来,人们就觉得画面中的人物在动,这就是影片.那电影的实质就是N多张图片的集合.那 每张图片和帧又有什么关系呢?事实上,如果一部影片里面的图片,我们原封不动的全部存起来,空间会很大很大很大,但是如果通过一定的算法(这里不讲相关算 法),把每一张图片压缩(编码_encode)一下,变成 帧.再把帧连起来变成流,再把不同的流放到某个容器里面,这就是我们平常看见的电影文件了,文件 碟中谍4.H264.ACC.mkv,他为什么要

ffmpeg解码流程

来源:http://www.xuebuyuan.com/807209.html ffmpeg解码流程 . 2013年08月20日 ⁄ 综合 ⁄ 共 14054字 ⁄ 字号 小 中 大 ⁄ 评论关闭 文章目录 1. 注册所有容器格式和CODEC:av_register_all() 2. 打开文件:av_open_input_file() 3. 从文件中提取流信息:av_find_stream_info() 4. 穷举所有的流,查找其中种类为CODEC_TYPE_VIDEO 5. 查找对应的解码器:

H.264解码过程剖析-4

x264开源工程实现H.264的视频编码,但没有提供对应的解码器.ffmpeg开源多媒体编解码集合汇集了市面上几乎所有媒体格式的编解码的源代码.其中的H264.c就是一个能正常解码x264编码码流的独立的源文件,其使用步骤也与上述的编码或解码CODEC应用案例基本相同.这一节通过自顶向下的方式,讲述H264.c如何实现H.264视频解码过程. H264.c源文件有几千行,代码量庞大,很不便于浏览.分析和移植.同时该文件还依赖其他源文件,组织结构较复杂,实现平台由于不是基于Windows的VC++

FFmpeg解码H264及swscale缩放详解

本文概要: 本文介绍著名开源音视频编解码库ffmpeg如何解码h264码流,比较详细阐述了其h264码流输入过程,解码原理,解码过程.同时,大部分应用环境下,以原始码流视频大小展示并不是最佳方式,因此,开发者不仅仅需要对视频流解码,并且需要缩放图像以展示于不同窗体下. 综上,本文除介绍ffmpeg解码h264,同时阐述如何使用swscale缩放视频流. 文章使用的开发环境Ubuntu12.04..交流邮箱:[email protected]. 转载请注明出处 CSDN--固本培元. ffmpeg

FFMPEG解码264文件步骤

FFMPEG解码264文件步骤: http://www.360doc.com/userhome.aspx?userid=13084517&cid=3# 转载地址:http://www.360doc.com/content/13/0906/18/13084517_312677466.shtml 本文以H264视频流为例,讲解解码流数据的步骤. 为突出重点,本文只专注于讨论解码视频流数据,不涉及其它(如开发环境的配置等).如果您需要这方面的信息,请和我联系. 准备变量 定义AVCodecContex

在iOS平台使用ffmpeg解码h264视频流

来源:http://www.aichengxu.com/view/37145 在iOS平台使用ffmpeg解码h264视频流,有需要的朋友可以参考下. 对于视频文件和rtsp之类的主流视频传输协议,ffmpeg提供avformat_open_input接口,直接将文件路径或URL传入即可打开.读取视频数据.解码器初始参数设置等,都可以通过调用API来完成. 但是对于h264流,没有任何封装格式,也就无法使用libavformat.所以许多工作需要自己手工完成. 这里的h264流指AnnexB,也

mingw编译ffmpeg+x265过程记录

mingw编译ffmpeg+x265过程记录 email: [email protected] 工作环境 OS:windows 7 1.相关资源下载 Ffmpeg-2.3     http://ffmpeg.org/releases/ffmpeg-2.3.3.tar.bz2 X265-1.3下载  https://bitbucket.org/multicoreware/x265/wiki/Home http://ffmpeg.zeranoe.com/builds/source/external_

使用FFmpeg解码H264-2015.01.14

使用jni方式调用FFmepg项目中接口,对H264裸码进行解码. 该Demo主要实现从文件中读取H264编码的视频流,然后使用FFmpeg解码,将解码后的码流保存到文件. 工程目录结构如图所示: Android.mk文件内容如下 LOCAL_PATH := $(call my-dir) # FFmpeg library include $(CLEAR_VARS) LOCAL_MODULE := avcodec LOCAL_SRC_FILES := $(LOCAL_PATH)/libs/liba