用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 ...
随机推荐
- [转载]C#中int和IntPtr相互转换
方法一. int转IntPtr int i = 12; IntPtr p = new IntPtr(i); IntPtr转int int myi = (int)p; ...
- jQuery1.9.1源码分析--Animation模块
var fxNow, // 使用一个ID来执行动画setInterval timerId, rfxtypes = /^(?:toggle|show|hide)$/, // eg: +=30.5px / ...
- Indent Guides VS 插件 对齐线
- POJ 2251 Dungeon Master(广搜,三维,简单)
题目 简单的3d广搜,做法类似与 hdu 的 胜利大逃亡 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<str ...
- 2014多校第一场D题 || HDU 4864 Task (贪心)
题目链接 题意 : 用N台机器,M个任务,每台机器都有一个最大工作时间和等级,每个任务有一个需要工作时间和一个等级.如果机器完成一个任务要求是:机器的工作时间要大于等于任务的时间,机器的等级要大于等于 ...
- [SQL Server系] -- 基本概念
以下是我总结的 SQL Server 数据库中的一些 基本概念,以便模糊时查询, 欢迎补充 1:主键: 概念: 数据表 经常有 一个列 或 列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称 ...
- android 输入法的打开和关闭
一.打开输入法窗口: InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.IN ...
- lintcode:在二叉查找树中插入节点
题目: 在二叉查找树中插入节点 给定一棵二叉查找树和一个新的树节点,将节点插入到树中. 你需要保证该树仍然是一棵二叉查找树. 样例 给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样 ...
- 261. Graph Valid Tree
题目: Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nod ...
- 写Java程序让Jvm崩溃
package jvm; public class HeapCrash { public static void main(String[] args) { //Object[] o = {“abc” ...