您的位置:首页 > 编程语言

利用ffmpeg来进行视频解码的完整示例代码(H.264)

2013-04-16 16:35 656 查看
Decode()

{

FILE * inpf;

int nWrite;

int i,p;

int nalLen;

unsigned char* Buf;

int got_picture, consumed_bytes;

unsigned char *DisplayBuf;

DisplayBuf=(unsigned char *)malloc(60000);

char outfile[] = "test.pgm";

//1.打开输入文件

inpf = fopen("test.264", "rb");

//outf = fopen("out.yuv", "wb");

if(!inpf)

{

goto Decodereturn;

}

nalLen = 0;

Buf = (unsigned char*)calloc ( 1000000, sizeof(char)); //准备解码文件缓冲

//2.注册解码器,并且找到H264解码器

avcodec_init();

avcodec_register_all();

codec = avcodec_find_decoder(CODEC_ID_H264);

if (!codec) {

return 0;

}

//allocate codec context

//分配解码器内存

c = avcodec_alloc_context();

if(!c){

return 0;

}

//open codec

//3.打开解码器

if (avcodec_open(c, codec) < 0) {

return 0;

}

//allocate frame buffer

//分配解码器用的帧缓冲

picture = avcodec_alloc_frame();

if(!picture){

return 0;

}

rgbdatanew = (unsigned char *)malloc(sizeof(unsigned char)*(3 * width * height));

while(!feof(inpf))

{

//4.获取下一个NAL的长度,并且将NAL放入Buf

nalLen = getNextNal(inpf, Buf);

//5.对改NAL解码,解码的YUV数据存在picture中

consumed_bytes= avcodec_decode_video(c, picture, &got_picture, Buf, nalLen);

if(consumed_bytes > 0)

{

//6.将picture中的YUV数据显示或者保存到文件

p=0;

for(i=0; i<c->height; i++)

{

memcpy(DisplayBuf+p,picture->data[0] + i * picture->linesize[0], c->width);

p+=c->width;

}

for(i=0; i<c->height/2; i++)

{

memcpy(DisplayBuf+p,picture->data[1] + i * picture->linesize[1], c->width/2);

p+=c->width/2;

}

for(i=0; i<c->height/2; i++)

{

memcpy(DisplayBuf+p,picture->data[2] + i * picture->linesize[2], c->width/2);

p+=c->width/2;

}

//显示画面

DisplayVideo(DisplayBuf);

}

}

//7.关闭输入文件

if(inpf)

fclose(inpf);

Decodereturn:

//8.关闭解码器,释放解码器内存

if(c) {

avcodec_close(c);

av_free(c);

c = NULL;

}

//9.释放解码画面内存

if(picture) {

av_free(picture);

picture = NULL;

}

//10.释放解码文件缓冲

if(Buf)

{

free(Buf);

Buf = NULL;

}

free(DisplayBuf);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: