打算从ffmpeg提取h.264解码器了,求有相关经验的指点一下
dwing吧
全部回复
仅看楼主
level 7
genechiu 楼主
已经找了很长时间没有收获,要么版本太旧,要么不支持high profile等特性造成一些文件无法正常解码,于是打算自己试试看。目标就是能正常解码264成yuv,其他都不要,也不用转成vc工程,gcc下能编译过就行。
搜索了一下大概方法两种:从h264.c开始遇到include的,就把相关文件添加进来,直到能编译通过。另外一种是加-pg生成gmon.out然后把用到函数的相关文件添加进去,直到编译通过。前面那种方法感觉还是会关联上很多文件,而且不一定能编译的过,而后面的方法又怕遗漏掉一些文件。本人纯菜鸟真心想要做这件事,希望各位牛人能指定一下,谢谢了。
2011年10月23日 13点10分 1
level 13
ffmpeg里的代码相互依赖非常严重,提取其中一部分很麻烦的,不建议提取,只引用就好了.
2011年10月23日 14点10分 3
level 7
genechiu 楼主
我觉得也是这样,先能精简多少是多少吧。也不是要新特性,起码B帧能支持。
2011年10月23日 14点10分 4
level 7
genechiu 楼主
ffmpeg是在太大了,没办法只能精简,我也不想哎 [88]
2011年10月23日 14点10分 5
level 7
genechiu 楼主
第一种不行,相互关联了1750个,我瞬间石化了[拍砖]
2011年10月25日 07点10分 6
level 7
genechiu 楼主
哦弄错,如果只从h264.c开始,只有131个,还好~还好[我爱牛奶]
2011年10月25日 07点10分 7
level 7
genechiu 楼主
发现我错了,原来本身就能优化。。把不要的disable之后--enable-small就1m不到了,看来以后还是得先多学习[揉脸]
2011年10月25日 14点10分 8
level 7
genechiu 楼主
好,我也是菜鸟在撞墙期呢..先测试看.. 谢谢提供MPCVideoDec.dll咨询
2011年10月25日 15点10分 12
level 7
genechiu 楼主
编译ffmpeg.exe测试了一些都能用了,自己按例子写了个解单帧没事多帧的时候报错。。
[h264 @ 003e2440] Missing reference picture
[h264 @ 003e2440] decode_slice_header error
[h264 @ 003e2440] Missing reference picture
......
回头比较下哪里不一样[汗]
2011年10月25日 22点10分 13
level 7
genechiu 楼主
2011年10月26日 09点10分 14
level 7
genechiu 楼主
static void video_decode(FILE *fin,FILE* fout){
int i,j,len,got;
AVPacket avpkt;
avcodec_init();
avcodec_register_all();
av_init_packet(&avpkt);
uint8_t inbuf[INBUF_SIZE+FF_INPUT_BUFFER_PADDING_SIZE];
memset(inbuf+INBUF_SIZE,0,FF_INPUT_BUFFER_PADDING_SIZE);
AVCodec *codec=avcodec_find_decoder(CODEC_ID_H264);
if(!codec){
fprintf(stderr,"codec not found\n");
exit(1);
}
AVCodecContext *c=avcodec_alloc_context3(codec);
AVFrame *picture=avcodec_alloc_frame();
if(avcodec_open(c,codec)<0){
fprintf(stderr,"could not open codec\n");
exit(1);
}
for(;;){
avpkt.size=fread(inbuf,1,INBUF_SIZE,fin);
if(avpkt.size==0)break;
avpkt.data=inbuf;
while(avpkt.size>0){
len=avcodec_decode_video2(c,picture,&got,&avpkt);
if(len<0){
fprintf(stderr,"error while decoding frames\n");
exit(1);
}
if(got){
for(i=0;i<3;i++){
int width=i==0?c->width:c->width>>1;
int height=i==0?c->height:c->height>>1;
int linesize=picture->linesize[i];
uint8_t* data=picture->data[i];
for(j=0;j<height;j++){
fwrite(data,1,width,fout);
data+=linesize;
}
}
}
avpkt.size-=len;
avpkt.data+=len;
}
}
av_free(picture);
avcodec_close(c);
av_free(c);
}
按例子改的代码,不知道为什么会报错..能帮忙看下吗?
2011年10月26日 10点10分 15
level 13
我也不清楚原因, UCI只需要解单帧, 多帧我没试过
2011年10月26日 11点10分 16
level 7
genechiu 楼主
恩 我慢慢消化ffmpeg.c
2011年10月27日 10点10分 17
level 7
genechiu 楼主
知道了avcodec_decode_video2只能解一帧,需要手动把每一帧送进去
管道输出的问题还是没解决,继续求解~
2011年10月28日 01点10分 18
level 4
顶楼主
[Yeah]
2011年10月28日 02点10分 19
level 1
请问你是在vc下做还是vs下呢
2012年01月09日 14点01分 20
level 1
我有几个静态库,在vs2010下能用来解码h.264但是在vc下面怎么弄都不行,总是说error LNK2001,想跟你聊下,qq66037252
2012年01月09日 14点01分 21
level 1
楼主你的问题解决了嘛,我是送单帧进去解的,但也出错
2012年03月04日 11点03分 22
如果你是一帧一帧地放进去解码,那应该是可以的,前提是你放进去的Packet大小刚好是编码后的一帧的大小,然后有一个地方需要注意的,就是第一次解码时返回的got是0的,要放空一次解码,不然最后解码出来会发现少了一帧。。
2012年11月22日 09点11分
1