最新的ffmpeg解不已实时网络264码流


        最新的ffmpeg解不了实时网络264码流<br />

各位同学有用最新的ffmpeg解过网络实时264码流的吗?我试了无数的方法都解不开。下面是大致的代码,

初始化:

avlogsetcallback( avlog_callback );

avcodecregisterall();

avCodec = avcodecfinddecoder( CODECIDH264 );

avParserContext = avparserinit( CODECIDH264 );

avContext = avcodecalloccontext3( avCodec );

avContext->codecid = CODECID_H264;

avFrame = avcodecallocframe();

int numBytes = avpicturegetsize(PIXFMTYUV420P, 720,576);

avBuf = (uint8_t*)malloc(numBytes);        

avpicturefill((AVPicture *)avFrame, avBuf, PIXFMT_YUV420P,720, 576);


if(avCodec->capabilities & CODECCAPTRUNCATED)

        avContext->flags|= CODECFLAGTRUNCATED; 


avcodec_open2( avContext, avCodec, NULL)


解码:

while( curr264nalu_size )

{

   unsigned char* buf = 0;

   int buf_len = 0;

   int len = avparserparse2( 

                        avParserContext, avContext, 

        &buf, &buf_len,<br />

                        curr264naluptr , curr264nalusize ,

        0, 0, 0);<br />

   curr264nalu_ptr += len;

   curr264nalu_size -= len;

 

   if( buf_len > 0 )

   {

     AVPacket avpkt = {0};

     avpkt.data = buf;

     avpkt.size = buf_len;


     avcodecdecodevideo2(this->avContext, this->avFrame, &got_picture, &avpkt);

     if( got_picture )

     {

          ....

     } 

}


在解码时got_picture永远为0.


而如果把收到的每一个curr264nalu都写入文件,文件可以用暴风影音正常播放。

我使用的dll,lib来自ffmpeg-20130514-git-56ba331-win32-shared。


哪位大侠看出是我代码的问题,还是该版本的ffmpeg就有问题呢?

Web开发 flex 程序开发

liu-tc 10 years, 6 months ago

要是完整1帧才能解开,从I帧才能解。你试下其它版本

我去年的时候也遇到这样的问题了,采用的是早点的版本

init0 answered 10 years, 6 months ago

代码不完整,但整个流程应该是对的。

AVPacket avpkt = {0};的后面是不是应该初始化一下啊?

avinitpacket(&avpkt);

黒川ビリティ answered 10 years, 6 months ago

要解实时H264码流,我的方法是,自己从socket接收,缓存,拼装H.264包,最后调用ffmpeg库解码;

如果从RTP收H.264数据,可根据RTP的marker字段判断:当marker==1时,将缓存H264数据拼包;当marker==0时,缓存。

lixiang answered 10 years, 6 months ago

提供一下思路吧,如果使用ffmpeg的接口的话,最好是用avreadframe的方法得到每一帧数据,然后调用解码函数,但是你的是网络流,那么需要注册自己的read函数,需要调用avioalloccontext(buf, BUFSIZE, 0, NULL, readdata, NULL, NULL)接口,调用你的网络读数据的接口,可以参照


建议你第一步先用ffmpeg的接口解码你保存的H264数据文件,然后在参照上面的网页,修改位网络数据。注意检查一些ffmpeg的返回值,并且注意h264的解码需要PPS和SPS参数,要看看这些参数是在每一个I帧前面,还是说通过RTSP的SDP会话来的(也可能你是http的)

疾风凯伊路 answered 10 years, 6 months ago

Your Answer