主要針對(duì)自己手動(dòng)解析h264裸流文件得到圈盔,分割得到buffer給ffmpeg解析
在網(wǎng)上找了很久這方面的內(nèi)容,發(fā)現(xiàn)網(wǎng)上的代碼都太舊了,所使用的函數(shù)舊到連最新版本的ffmpeg都已經(jīng)不包含了,所以對(duì)于我這個(gè)初學(xué)者來說太坑拉驰吓。不過經(jīng)過多次查找ffmpeg的頭文件和結(jié)合網(wǎng)上的內(nèi)容,終于成功可以解碼拉∠捣睿現(xiàn)在貼出來檬贰。
首先是初始化一些參數(shù)
- 下面初始化h264解碼庫
//下面初始化h264解碼庫
avcodec_init();
av_register_all();
AVFrame *pFrame_ = NULL;
AVCodecContext *codec_ = avcodec_alloc_context();
/* find the video encoder */
AVCodec *videoCodec = avcodec_find_decoder(CODEC_ID_H264);
if (!videoCodec)
{
cout << "codec not found!" << endl;
return -1;
}
//初始化參數(shù),下面的參數(shù)應(yīng)該由具體的業(yè)務(wù)決定
codec_->time_base.num = 1;
codec_->frame_number = 1; //每包一個(gè)視頻幀
codec_->codec_type = AVMEDIA_TYPE_VIDEO;
codec_->bit_rate = 0;
codec_->time_base.den = 30;//幀率
codec_->width = 1280;//視頻寬
codec_->height = 720;//視頻高
if(avcodec_open(codec_, videoCodec) >= 0)
pFrame_ = avcodec_alloc_frame();// Allocate video frame
else
return -1;
- 下面是具體的解碼的代碼
AVPacket packet = {0};
int frameFinished = dwBufsize;//這個(gè)是隨便填入數(shù)字缺亮,沒什么作用
packet.data = pBuffer;//這里填入一個(gè)指向完整H264數(shù)據(jù)幀的指針
packet.size = dwBufsize;//這個(gè)填入H264數(shù)據(jù)幀的大小
//下面開始真正的解碼
avcodec_decode_video2(codec_, pFrame_, &frameFinished, &packet);
if(frameFinished)//成功解碼
{
int picSize = codec_->height * codec_->width;
int newSize = picSize * 1.5;
//申請(qǐng)內(nèi)存
unsigned char *buf = new unsigned char[newSize];
int height = p->codec->height;
int width = p->codec->width;
//寫入數(shù)據(jù)
int a=0,i;
for (i=0; i<height; i++)
{
memcpy(buf+a,pFrame_->data[0] + i * pFrame_->linesize[0], width);
a+=width;
}
for (i=0; i<height/2; i++)
{
memcpy(buf+a,pFrame_->data[1] + i * pFrame_->linesize[1], width/2);
a+=width/2;
}
for (i=0; i<height/2; i++)
{
memcpy(buf+a,pFrame_->data[2] + i * pFrame_->linesize[2], width/2);
a+=width/2;
}
//===============
//到這里翁涤,buf里面已經(jīng)是yuv420p的數(shù)據(jù)了,可以對(duì)它做任何的處理拉萌踱!
//===============
delete [] buf;
}
不過我發(fā)現(xiàn)這樣解碼很耗cpu資源葵礼,我的Core2 E7400 2.8G的處理器,解碼1920X1080分辨率每秒30幀的視頻時(shí)虫蝶,CPU占用率能用到差不多50%。
PS:原來avcodec_decode_video2這個(gè)函數(shù)會(huì)修改codec_里面的參數(shù)的倦西,也就是說如果原來里面填的分別率是1280X720能真,運(yùn)行avcodec_decode_video2
后 codec
里面會(huì)變成實(shí)際視頻的分辨率。
[轉(zhuǎn)載自:https://www.cnblogs.com/lidabo/p/3326502.html]