level 7
已经找了很长时间没有收获,要么版本太旧,要么不支持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
我觉得也是这样,先能精简多少是多少吧。也不是要新特性,起码B帧能支持。
2011年10月23日 14点10分
4
level 7
好,我也是菜鸟在撞墙期呢..先测试看.. 谢谢提供MPCVideoDec.dll咨询
2011年10月25日 15点10分
12
level 7
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
知道了avcodec_decode_video2只能解一帧,需要手动把每一帧送进去
管道输出的问题还是没解决,继续求解~
2011年10月28日 01点10分
18
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分