用ffmpeg把H264数据流解码成YUV420P

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

首先是初始化一些参数

 

[cpp] view plaincopy

 

 

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

下面是具体的解码的代码

 

[cpp] view plaincopy

 

 

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

 

 

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

 

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

时间: 2024-09-09 01:17:52

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

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

农历2014年底了,将前段时间工作中研究的FFMPEG解码H264流程在此做一下整理,也算作年终技术总结了! H264解码原理: H264的原理参考另一篇博文 http://blog.csdn.net/rootusers/article/details/43563133 H264分为NAL(网络抽象层)和VCL(视频编码层)   解码器的总框架: 解码器的流程为:将NAL数据位流输入到H264的解码器中,熵解码模块解码后输出量化系数X:系数经过反量化和反变换得到残差数据R:解码器使用从码流中解码

利用ffmpeg将H264流 解码为RGB

利用H264解码分为几个步骤:   注意一点在添加头文件的时候要添加extern "C",不然会出现错误 [cpp] view plaincopy extern "C"   {   #include <avcodec.h>   #include <avformat.h>   #include <avutil.h>   #include <swscale.h>   };       这里申明了几个全局变量 [cpp] v

byte-java有什么技术可以把H264编码的音视频码流解码成视频与音频分开??

问题描述 java有什么技术可以把H264编码的音视频码流解码成视频与音频分开?? 小弟最近在做个视频播放相关项目,我接收到一段H264的音视频码流数据, 存放在byte[]中,由于项目需要,我需要从byte[] 分别取出视频流和音频流.但是,由于本人... 还请牛人点拨!!! 越详细越好,我第一次接触h264,解码需要知道些什么参数之类的,各种点拨,谢谢了!! 解决方案 http://jolestar.iteye.com/blog/177522 看看这个

H264视频编码成MP4文件

firehood的专栏 Wince嵌入式开发       目录视图 摘要视图 订阅 赠书 | AI专栏(AI圣经!<深度学习>中文版)      每周荐书:Kotlin.分布式.Keras(评论送书)      [获奖公布]征文 | 你会为 AI 转型么?   H264视频编码成MP4文件 2013-04-25 22:29 14324人阅读 评论(15) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载.         最近需要将H264视频编码成MP4格式.研究了一下,一种方

adnroid-AAC解码成PCM然后播放。大神帮帮忙怎么整成PCM啊!

问题描述 AAC解码成PCM然后播放.大神帮帮忙怎么整成PCM啊! 如题,本人小白.真心不是很明白jni这个东西,跪求大神帮帮忙. 解决方案 代码 [cpp] view plaincopy /** *最简单的基于FFmpeg的音频编码器 *Simplest FFmpeg Audio Encoder *雷霄骅 Lei Xiaohua *leixiaohua1020@126.com *中国传媒大学/数字电视技术 *Communication University of China / Digital

ffmpeg rtsp rtmp-Ubuntu上用FFmpeg将rtsp流转换成rtmp流出错!

问题描述 Ubuntu上用FFmpeg将rtsp流转换成rtmp流出错! 使用"ffmpeg -i rtsp://admin:12345@172.27.35.55 -f flv rtmp://172.27.35.2/live/stream"命令时出错 其中172.27.35.2是我电脑的IP,172.27.35.55是网络摄像机的IP 解决方案 你本地有LiveServer吗?https://github.com/winlinvip/simple-rtmp-server

json-ios--URL解码成JSON

问题描述 ios--URL解码成JSON 得到响应如下: param=%7B%22paymentMode%22:%22%22,%22transactionId%22:%2231674%22,%22pgRespCode%22:%223%22,%22TxMsg%22:%22Canceled%20by%20user%22,%22authIdCode%22:%22%22,%22currency%22:%22INR%22,%22amount%22:%221.00%22,%22addressStreet1%

264解码-h264流解码图像显示,请大神帮忙指点迷津

问题描述 h264流解码图像显示,请大神帮忙指点迷津 我们这个程序是从IP摄像头获取H264 Streaming 然后播放出来!因为必须走Http/tcp/rtsp 所以不能用安卓的MediaPlayer 直接给定URL 来播放!因为这样走的是Http/udp/rtsp.所以看到安卓4.1的版本有一个MediaCodec可以来解析H264可是我看到那个只能解析文件,而且不知道怎么把解析出来的数据变成图像.所以请高人帮忙····· MediaCodec是怎么使用的 解析出来的数据又怎么组成图像播放

android里面怎么把speex解码成pcm啊?

问题描述 android里面怎么把speex解码成pcm啊? android里面怎么把speex解码成pcm啊? android里面怎么把speex解码成pcm啊? android里面怎么把speex解码成pcm啊?