在网上找了很久这方面的内容,发现网上的代码都太旧了,所使用的函数旧到连最新版本的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】【1115】【POI2009】石子游戏KAM

    博弈论 这个题……一看就觉得很捉急啊= =肿么办? 灵光一现:差分一下~ 那么我们看一下差分以后,从第 i 堆中拿走 k 个石子变成了:a[i]-=k; a[i+1]+=k; 嗯这就转化成了阶梯博弈! ...

  2. Linux 终端访问 FTP 及 上传下载 文件

    今天同事问我一个问题,在Linux 下访问FTP,并将文件上传上去. 我之前一直是用WinSCP工具的. 先将文件从linux copy到windows下,然后在传到ftp上.google 一下. 方 ...

  3. centos6.5\win7双系统安装配置

    一.安装所需软件 1.分区助手专业版PACNPro.exe(必需):用来对硬盘分区,将磁盘的一部分格式化成Linux可以识别的ext3格式 2.Ext2Fsd(硬盘安装必需,光盘安装不用):因为Win ...

  4. UVALive 6533

    哈夫曼树  倒过来思考 ~ 最深的叶子 值为1  所以最深的先出队列 #include <iostream> #include <cstdio> #include <cs ...

  5. uva 991

    卡特兰数  最后不输出空行... #include <cstdio> #include <cstdlib> #include <cmath> #include &l ...

  6. Unity3D WP8发布解决方案名 DefaultPackageName 修改问题

    原地址:http://blog.csdn.net/w337198302/article/details/16960661 在对Unity3D游戏进行Windows phone 8 发布的时候,首先是需 ...

  7. 【hadoop2.6.0】用C++ 编写mapreduce

    hadoop通过hadoop streaming 来实现用非Java语言写的mapreduce代码. 对于一个一点Java都不会的我来说,这真是个天大的好消息. 官网上hadoop streaming ...

  8. 核稀疏表示分类(KSRC)

    参考:<Kernel SparseRepresention-Based Classifier> 原文地址:http://www.cnblogs.com/Rosanna/p/3372153. ...

  9. java基础知识回顾之---java String final类普通方法的应用之“两个字符串中最大相同的子串”

    /* * 3,两个字符串中最大相同的子串. * "qwerabcdtyuiop" * "xcabcdvbn" *  * 思路: * 1,既然取得是最大子串,先看 ...

  10. **PHP随机数算法

    <?php $tmp = range(1,30);print_r(array_rand($tmp,10));?> 输出: Array( [0] => 6 [1] => 8 [2 ...