用ffmpeg把H264数据流解码成YUV420P
在网上找了很久这方面的内容,发现网上的代码都太旧了,所使用的函数旧到连最新版本的ffmpeg都已经不包含了,所以对于我这个初学者来说太坑拉。不过经过多次查找ffmpeg的头文件和结合网上的内容,终于成功可以解码拉。现在贴出来。
首先是初始化一些参数
- //下面初始化h264解码库
- avcodec_init();
- av_register_all();
- AVFrame *pFrame_ = NULL;
- AVCodecContext *codec_ = avcodec_alloc_context();
- /* find the video encoder */
- AVCodec *videoCodec = avcodec_find_decoder(CODEC_ID_H264);
- if (!videoCodec)
- {
- cout << "codec not found!" << endl;
- return -1;
- }
- //初始化参数,下面的参数应该由具体的业务决定
- codec_->time_base.num = 1;
- codec_->frame_number = 1; //每包一个视频帧
- codec_->codec_type = AVMEDIA_TYPE_VIDEO;
- codec_->bit_rate = 0;
- codec_->time_base.den = 30;//帧率
- codec_->width = 1280;//视频宽
- codec_->height = 720;//视频高
- if(avcodec_open(codec_, videoCodec) >= 0)
- pFrame_ = avcodec_alloc_frame();// Allocate video frame
- else
- return -1;
下面是具体的解码的代码
- AVPacket packet = {0};
- int frameFinished = dwBufsize;//这个是随便填入数字,没什么作用
- packet.data = pBuffer;//这里填入一个指向完整H264数据帧的指针
- packet.size = dwBufsize;//这个填入H264数据帧的大小
- //下面开始真正的解码
- avcodec_decode_video2(codec_, pFrame_, &frameFinished, &packet);
- if(frameFinished)//成功解码
- {
- int picSize = codec_->height * codec_->width;
- int newSize = picSize * 1.5;
- //申请内存
- unsigned char *buf = new unsigned char[newSize];
- int height = p->codec->height;
- int width = p->codec->width;
- //写入数据
- int a=0,i;
- for (i=0; i<height; i++)
- {
- memcpy(buf+a,pFrame_->data[0] + i * pFrame_->linesize[0], width);
- a+=width;
- }
- for (i=0; i<height/2; i++)
- {
- memcpy(buf+a,pFrame_->data[1] + i * pFrame_->linesize[1], width/2);
- a+=width/2;
- }
- for (i=0; i<height/2; i++)
- {
- memcpy(buf+a,pFrame_->data[2] + i * pFrame_->linesize[2], width/2);
- a+=width/2;
- }
- //===============
- //到这里,buf里面已经是yuv420p的数据了,可以对它做任何的处理拉!
- //===============
- delete [] buf;
- }
不过我发现这样解码很耗cpu资源,我的Core2 E7400 2.8G的处理器,解码1920X1080分辨率每秒30帧的视频时,CPU占用率能用到差不多50%。
PS:原来avcodec_decode_video2这个函数会修改codec_里面的参数的,也就是说如果原来里面填的分别率是1280X720,运行avcodec_decode_video2后codec_里面会变成实际视频的分辨率。
用ffmpeg把H264数据流解码成YUV420P的更多相关文章
- FFMPEG实现H264的解码(从源代码角度)
农历2014年底了,将前段时间工作中研究的FFMPEG解码H264流程在此做一下整理,也算作年终技术总结了! H264解码原理: H264的原理参考另一篇博文 http://blog.csdn.net ...
- 利用ffmpeg将H264流 解码为RGB
利用H264解码分为几个步骤: 注意一点在添加头文件的时候要添加extern "C",不然会出现错误 [cpp] view plaincopy extern "C&quo ...
- [ffmpeg] h264并行解码
ffmpeg中的并行解码分为两种: Frame-level Parallelism Slice-level Parallelism Frame-level Parallelism 帧间依赖 我们之前讨 ...
- ffmpeg H264 编解码配置
ffmpeg H264编解码前面有文章介绍下,本文主要介绍一些参数配置. 编码: int InitEncoderCodec( int iWidth, int iHeight) { AVCodec * ...
- 转:关于视频H264编解码的应用实现
转:http://blog.csdn.net/scalerzhangjie/article/details/8273410 项目要用到视频编解码,最近半个月都在搞,说实话真是走了很多弯路,浪费了很多时 ...
- H264编码 封装成MP4格式 视频流 RTP封包
H264编码 封装成MP4格式 视频流 RTP封包 分类: 多媒体编程 2013-02-20 21:31 3067人阅读 ...
- H264视频编码成MP4文件
firehood的专栏 Wince嵌入式开发 目录视图 摘要视图 订阅 赠书 | AI专栏(AI圣经!<深度学习>中文版) 每周荐书:Kotlin.分布式.Keras ...
- javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片
javacpp-ffmpeg系列: javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片 javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转 ...
- 【FFMPEG】【ARM-Linux开发】fmpeg安装第三方编码器(encoder)库,ffmpeg编码h264(完)
fmpeg安装第三方编码器(encoder)库,ffmpeg编码h264(完) ffmpeg安装第三方编码器(encoder)库 关键词:ffmpeg.编码h264.第三方encoder 安装好了ff ...
随机推荐
- nenu contest2
http://vjudge.net/vjudge/contest/view.action?cid=54562#overview H B. Polygons http://codeforces.com ...
- Sandcastle:生成.NET API文档的工具 (帮忙文档)
(1)准备软件 首先需要我们准备如下软件: SandCastle, 下载地址: http://sandcastle.codeplex.com/releases/view/47665 (2)准备项目文件 ...
- 01-04-03【Nhibernate (版本3.3.1.4000) 出入江湖】Criteria API关联查询
Criteria API关联查询 如果说HQL查询还有需要了解点SQL语法知识,并不是完全彻底面向对象查询, 那么Criterial API就是完全面向对象的查询方式. public IList< ...
- uva 307
排序之后再剪枝,有点神 #include <cstdio> #include <cstdlib> #include <cmath> #include <map ...
- uva 10910
简单dp /************************************************************************* > Author: xlc2845 ...
- Java 泛型(Generics)
Generics, 类似C++中的模版. 允许在定义类和接口的时候使用类型参数(type parameters), 声明的类型参数在使用的时候用具体的类型来替换. 如 ArrayList<Str ...
- 220 DIV2 A. Inna and Pink Pony
Inna and Pink Pony 输入n,m,i,j,a,b 可以看成n行m列的矩阵,起点(i,j),每次移动(a,b),(-a,-b),(-a,b),(a,-b) 可移动到(1,m),(n,1) ...
- lintcode 中等题 :Maximum Product Subarray 最大连续乘积子序列
题目 乘积最大子序列 找出一个序列中乘积最大的连续子序列(至少包含一个数). 样例 比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6. 解题 法一:直接暴力求解 时 ...
- 目标检测的图像特征提取之(三)Haar特征
1.Haar-like特征 Haar-like特征最早是由Papageorgiou等应用于人脸表示,Viola和Jones在此基础上,使用3种类型4种形式的特征. Haar特征分为三类:边缘特征.线性 ...
- *[hackerrank]Volleyball Match
https://www.hackerrank.com/contests/w1/challenges/volleyball-match 此题不错,首先可以看出是DP,S(x, y)= S(x - 1, ...