用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 ...
随机推荐
- 【BZOJ】【1662】/【POJ】【3252】 【USACO 2006 Nov】Round Number
数位DP 同上一题Windy数 预处理求个组合数 然后同样的方法,这次是记录一下0和1的个数然后搞搞 Orz cxlove /************************************* ...
- [转载]C# 多线程、控制线程数提高循环输出效率
C#多线程及控制线程数量,对for循环输出效率. 虽然输出不规律,但是效率明显提高. 思路: 如果要删除1000条数据,只使用for循环,则一个接着一个输出.所以,把1000条数据分成seed段,每段 ...
- [转载]DirectoryEntry配置IIS7出现ADSI Error:未知错误(0x80005000)
一.错误情况 环境:win7+iis7.0 DirectoryEntry配置IIS7出现如下错误 或者是 下面一段代码在IIS6.0下运转正常,但IIS7.0下运转会出错: System.Direct ...
- 关于在js中使用csstext的问题
会将前边所设置的css属性全部清空,慎用!
- 基于HOOK和MMF的Windows密码渗透技术
随着计算机与网络的普及,信息安全越来越成为人们所普遍关心的大事.密码的渗透与反渗透在此领域表现的愈演愈烈.本文深入分析了各个版本Windows密码的特点,尤其是针对windws2K/XP安全性提高的情 ...
- ext3grep 恢复删除
Linux ext2/ext3 文件删除恢复工具ext3grep安装使用 2010-08-23 18:03:10| 分类: 默认分类|举报|字号 订阅 一. 安装前系统环 ...
- Spring Boot 快速入门
Spring Boot 快速入门 http://blog.csdn.net/xiaoyu411502/article/details/47864969 今天给大家介绍一下Spring Boot MVC ...
- What is XMLHTTP? How to use security zones in Internet Explorer
Types of Security Zones Internet Zone This zone contains Web sites that are not on your computer or ...
- POJ 2912 Rochambeau(难,好题,枚举+带权并查集)
下面的是从该网站上copy过来的,稍微改了一点,给出链接:http://hi.baidu.com/nondes/item/26dd0f1a02b1e0ef5f53b1c7 题意:有N个人玩剪刀石头布, ...
- [转]数据结构之Trie树
1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...