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

    博弈论 这个是博弈游戏中的Wythoff博弈: 以下为我的代码: //POJ 1067 #include<cmath> #include<cstdio> #include< ...

  2. asp.net 获取客户机IP地址

    /// <summary> ///get client IP /// </summary> /// <returns></returns> public ...

  3. 8个月从CS菜鸟到拿到Google Offer的经历+内推

    http://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=77453&page=1&authorid=10377 ...

  4. UVA 10246 Asterix and Obelix

    题意:每个城市举办庆祝有一定的花费,A在路径上会选择庆祝花费最大的城市 让你求,A回家所花的路费和庆祝费最少,也就是说并不是最短路径就是结果, 还有可能就是路费比最短路径的多,但是庆祝费就比它的少,总 ...

  5. Matlab安装

    第一步:下载MATLAB 7.0,下载自己百度下就好. 三个ios文件 第二步:把每个IOS文件直接右键解压就好. 第三步:打开第一个解压文件夹.双击.exe文件 第四步:next之后把序列号黏贴上去 ...

  6. POJ 1724 ROADS(BFS+优先队列)

    题目链接 题意 : 求从1城市到n城市的最短路.但是每条路有两个属性,一个是路长,一个是花费.要求在花费为K内,找到最短路. 思路 :这个题好像有很多种做法,我用了BFS+优先队列.崔老师真是千年不变 ...

  7. HDU 1882 Strange Billboard(位运算)

    题目链接 题意 : 给你一个矩阵,有黑有白,翻转一个块可以让上下左右都翻转过来,问最少翻转多少次能让矩阵变为全白. 思路 : 我们从第一行开始枚举要翻转的状态,最多可以枚举到2的16次方,因为你只要第 ...

  8. 使用PowerDesigner进行数据库建模入门

    阅读目录 两种重要模型 创建表和主外键 创建视图和存储过程 生成数据库 PowerDesigner(简称PD)是一种强大的数据库建模工具,使用PD可以创建业务模型,UML类图等,当然最主要的功能是数据 ...

  9. JavaWeb项目开发案例精粹-第2章投票系统-002配置文件及公共类

    1. <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5&qu ...

  10. linux 显示当前用户信息

    1.w命令 2.who命令 3.who am i 4. users