在网上找了很久这方面的内容,发现网上的代码都太旧了,所使用的函数旧到连最新版本的ffmpeg都已经不包含了,所以对于我这个初学者来说太坑拉。不过经过多次查找ffmpeg的头文件和结合网上的内容,终于成功可以解码拉。现在贴出来。

首先是初始化一些参数

  1. //下面初始化h264解码库
  2. avcodec_init();
  3. av_register_all();
  4. AVFrame *pFrame_ = NULL;
  5. AVCodecContext *codec_ = avcodec_alloc_context();
  6. /* find the video encoder */
  7. AVCodec *videoCodec = avcodec_find_decoder(CODEC_ID_H264);
  8. if (!videoCodec)
  9. {
  10. cout << "codec not found!" << endl;
  11. return -1;
  12. }
  13. //初始化参数,下面的参数应该由具体的业务决定
  14. codec_->time_base.num = 1;
  15. codec_->frame_number = 1; //每包一个视频帧
  16. codec_->codec_type = AVMEDIA_TYPE_VIDEO;
  17. codec_->bit_rate = 0;
  18. codec_->time_base.den = 30;//帧率
  19. codec_->width = 1280;//视频宽
  20. codec_->height = 720;//视频高
  21. if(avcodec_open(codec_, videoCodec) >= 0)
  22. pFrame_ = avcodec_alloc_frame();// Allocate video frame
  23. else
  24. return -1;

下面是具体的解码的代码

  1. AVPacket packet = {0};
  2. int frameFinished = dwBufsize;//这个是随便填入数字,没什么作用
  3. packet.data = pBuffer;//这里填入一个指向完整H264数据帧的指针
  4. packet.size = dwBufsize;//这个填入H264数据帧的大小
  5. //下面开始真正的解码
  6. avcodec_decode_video2(codec_, pFrame_, &frameFinished, &packet);
  7. if(frameFinished)//成功解码
  8. {
  9. int picSize = codec_->height * codec_->width;
  10. int newSize = picSize * 1.5;
  11. //申请内存
  12. unsigned char *buf = new unsigned char[newSize];
  13. int height = p->codec->height;
  14. int width = p->codec->width;
  15. //写入数据
  16. int a=0,i;
  17. for (i=0; i<height; i++)
  18. {
  19. memcpy(buf+a,pFrame_->data[0] + i * pFrame_->linesize[0], width);
  20. a+=width;
  21. }
  22. for (i=0; i<height/2; i++)
  23. {
  24. memcpy(buf+a,pFrame_->data[1] + i * pFrame_->linesize[1], width/2);
  25. a+=width/2;
  26. }
  27. for (i=0; i<height/2; i++)
  28. {
  29. memcpy(buf+a,pFrame_->data[2] + i * pFrame_->linesize[2], width/2);
  30. a+=width/2;
  31. }
  32. //===============
  33. //到这里,buf里面已经是yuv420p的数据了,可以对它做任何的处理拉!
  34. //===============
  35. delete [] buf;
  36. }

不过我发现这样解码很耗cpu资源,我的Core2  E7400 2.8G的处理器,解码1920X1080分辨率每秒30帧的视频时,CPU占用率能用到差不多50%。

 

PS:原来avcodec_decode_video2这个函数会修改codec_里面的参数的,也就是说如果原来里面填的分别率是1280X720,运行avcodec_decode_video2后codec_里面会变成实际视频的分辨率。

用ffmpeg把H264数据流解码成YUV420P的更多相关文章

  1. FFMPEG实现H264的解码(从源代码角度)

    农历2014年底了,将前段时间工作中研究的FFMPEG解码H264流程在此做一下整理,也算作年终技术总结了! H264解码原理: H264的原理参考另一篇博文 http://blog.csdn.net ...

  2. 利用ffmpeg将H264流 解码为RGB

    利用H264解码分为几个步骤: 注意一点在添加头文件的时候要添加extern "C",不然会出现错误 [cpp] view plaincopy extern "C&quo ...

  3. [ffmpeg] h264并行解码

    ffmpeg中的并行解码分为两种: Frame-level Parallelism Slice-level Parallelism Frame-level Parallelism 帧间依赖 我们之前讨 ...

  4. ffmpeg H264 编解码配置

    ffmpeg H264编解码前面有文章介绍下,本文主要介绍一些参数配置. 编码: int InitEncoderCodec( int iWidth, int iHeight) { AVCodec * ...

  5. 转:关于视频H264编解码的应用实现

    转:http://blog.csdn.net/scalerzhangjie/article/details/8273410 项目要用到视频编解码,最近半个月都在搞,说实话真是走了很多弯路,浪费了很多时 ...

  6. H264编码 封装成MP4格式 视频流 RTP封包

    H264编码 封装成MP4格式 视频流 RTP封包         分类:             多媒体编程              2013-02-20 21:31     3067人阅读    ...

  7. H264视频编码成MP4文件

    firehood的专栏 Wince嵌入式开发       目录视图 摘要视图 订阅 赠书 | AI专栏(AI圣经!<深度学习>中文版)      每周荐书:Kotlin.分布式.Keras ...

  8. javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片

    javacpp-ffmpeg系列: javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片 javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转 ...

  9. 【FFMPEG】【ARM-Linux开发】fmpeg安装第三方编码器(encoder)库,ffmpeg编码h264(完)

    fmpeg安装第三方编码器(encoder)库,ffmpeg编码h264(完) ffmpeg安装第三方编码器(encoder)库 关键词:ffmpeg.编码h264.第三方encoder 安装好了ff ...

随机推荐

  1. 【BZOJ】【1662】/【POJ】【3252】 【USACO 2006 Nov】Round Number

    数位DP 同上一题Windy数 预处理求个组合数 然后同样的方法,这次是记录一下0和1的个数然后搞搞 Orz cxlove /************************************* ...

  2. [转载]C# 多线程、控制线程数提高循环输出效率

    C#多线程及控制线程数量,对for循环输出效率. 虽然输出不规律,但是效率明显提高. 思路: 如果要删除1000条数据,只使用for循环,则一个接着一个输出.所以,把1000条数据分成seed段,每段 ...

  3. [转载]DirectoryEntry配置IIS7出现ADSI Error:未知错误(0x80005000)

    一.错误情况 环境:win7+iis7.0 DirectoryEntry配置IIS7出现如下错误 或者是 下面一段代码在IIS6.0下运转正常,但IIS7.0下运转会出错: System.Direct ...

  4. 关于在js中使用csstext的问题

    会将前边所设置的css属性全部清空,慎用!

  5. 基于HOOK和MMF的Windows密码渗透技术

    随着计算机与网络的普及,信息安全越来越成为人们所普遍关心的大事.密码的渗透与反渗透在此领域表现的愈演愈烈.本文深入分析了各个版本Windows密码的特点,尤其是针对windws2K/XP安全性提高的情 ...

  6. ext3grep 恢复删除

    Linux ext2/ext3 文件删除恢复工具ext3grep安装使用 2010-08-23 18:03:10|  分类: 默认分类|举报|字号 订阅     一.           安装前系统环 ...

  7. Spring Boot 快速入门

    Spring Boot 快速入门 http://blog.csdn.net/xiaoyu411502/article/details/47864969 今天给大家介绍一下Spring Boot MVC ...

  8. 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 ...

  9. POJ 2912 Rochambeau(难,好题,枚举+带权并查集)

    下面的是从该网站上copy过来的,稍微改了一点,给出链接:http://hi.baidu.com/nondes/item/26dd0f1a02b1e0ef5f53b1c7 题意:有N个人玩剪刀石头布, ...

  10. [转]数据结构之Trie树

    1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...