在网上找了很久这方面的内容,发现网上的代码都太旧了,所使用的函数旧到连最新版本的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. html——a标签添加点击事件,火狐浏览器直接显示0

    一.问题描述 给一个a标签添加了点击事件,页面直接给了0如下图 二.问题解决 后台调试模式下,发现也进了后台方法,也返回了页面. 于是想到先把页面里大部分内容去掉,去掉所有js,查看是否是部分代码有问 ...

  2. OpenLDAP配置信息记录

    随着各种研发工具使用越来越多,单独为每个工具维护一个账号系统的开销越来越大,而且作为用户多个账号密码使用也越来越不方便.所以需要做一个统一账号登陆. 查询了多个方法,又因为之前用过LDAP,所以选择了 ...

  3. 管理Java垃圾回收的五个建议

    [编者按]本文作者是Niv Steingarten,是Takipi 的联合创始人,热衷于编写优雅简洁的代码.作者通过对垃圾收集器的介绍和梳理,在管理垃圾回收方面提出了五个建议,降低收集器开销,帮助大家 ...

  4. ubuntu安装hadoop2.6

    一:单机版 1.sudo gedit ~/.bashrc 加入JDK路径 #HADOOP VARIABLES START export JAVA_HOME=/usr/lib/jvm/java-1.7. ...

  5. java基础知识回顾之java Thread类学习(三)--java线程实现常见的两种方式实现好处:

    总结:实现Runnable接口比继承Thread类更有优势: 1.因为java只能单继承,实现Runnable接口可以避免单继承的局限性 2.继承Thread类,多个线程不能处理或者共享同一个资源,但 ...

  6. Android 监测手机联网状态 wifi、移动数据流量、无联网状态

    手机当完成联网时会发送一个广播,我们只要创建一个广播接收者即可,代码如下: package com.example.NetworkChangeReceiver2; import android.con ...

  7. 【转】Dr.com 5.20破解教程

    Dr.com 5.20破解教程 方法一  1.首先下载相关工具 Process Explorer(大家可以自行百度 一般绿色汉化版就可以)右键选择以管理员权限运行process的主程序 然后运行drc ...

  8. CTSC2016&&APIO2016游记

    4.30 下午衡中放假,我们因为比赛的缘故提前到中午12:00放假 然后我爸爸说要来接我,直到下午两点多他才到,然后衡中宿舍的楼管阿姨死活不给我开门 莫名其妙的等到了三点多快四点的时候我才跟实验班的一 ...

  9. python学习[二]

    继续学习 http://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html 词典的每个元素是键值对.元素没有顺序.dic = {'tom':11 ...

  10. mvn 安装ojdbc6.jar

    mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion= - Dpackaging=jar -Dfile ...