最新的ffmpeg解不了实时网络264码流
各位同学有用最新的ffmpeg解过网络实时264码流的吗?我试了无数的方法都解不开。下面是大致的代码,
初始化:
av_log_set_callback( av_log_callback );
avcodec_register_all();
avCodec = avcodec_find_decoder( CODEC_ID_H264 );
avParserContext = av_parser_init( CODEC_ID_H264 );
avContext = avcodec_alloc_context3( avCodec );
avContext->codec_id = CODEC_ID_H264;
avFrame = avcodec_alloc_frame();
int numBytes = avpicture_get_size(PIX_FMT_YUV420P, 720,576);
avBuf = (uint8_t*)malloc(numBytes);
avpicture_fill((AVPicture *)avFrame, avBuf, PIX_FMT_YUV420P,720, 576);
if(avCodec->capabilities & CODEC_CAP_TRUNCATED)
avContext->flags|= CODEC_FLAG_TRUNCATED;
avcodec_open2( avContext, avCodec, NULL)
解码:
while( curr_264_nalu_size )
{
unsigned char* buf = 0;
int buf_len = 0;
int len = av_parser_parse2(
avParserContext, avContext,
&buf, &buf_len,
curr_264_nalu_ptr , curr_264_nalu_size ,
0, 0, 0);
curr_264_nalu_ptr += len;
curr_264_nalu_size -= len;
if( buf_len > 0 )
{
AVPacket avpkt = {0};
avpkt.data = buf;
avpkt.size = buf_len;
avcodec_decode_video2(this->avContext, this->avFrame, &got_picture, &avpkt);
if( got_picture )
{
....
}
}
在解码时got_picture永远为0.
而如果把收到的每一个curr_264_nalu都写入文件,文件可以用暴风影音正常播放。
我使用的dll,lib来自ffmpeg-20130514-git-56ba331-win32-shared。
哪位大侠看出是我代码的问题,还是该版本的ffmpeg就有问题呢?
[解决办法]
代码不完整,但整个流程应该是对的。
AVPacket avpkt = {0};的后面是不是应该初始化一下啊?
av_init_packet(&avpkt);
[解决办法]
提供一下思路吧,如果使用ffmpeg的接口的话,最好是用av_read_frame的方法得到每一帧数据,然后调用解码函数,但是你的是网络流,那么需要注册自己的read函数,需要调用avio_alloc_context(buf, BUF_SIZE, 0, NULL, read_data, NULL, NULL)接口,调用你的网络读数据的接口,可以参照http://blog.sina.com.cn/s/blog_675142dc01010otk.html
建议你第一步先用ffmpeg的接口解码你保存的H264数据文件,然后在参照上面的网页,修改位网络数据。注意检查一些ffmpeg的返回值,并且注意h264的解码需要PPS和SPS参数,要看看这些参数是在每一个I帧前面,还是说通过RTSP的SDP会话来的(也可能你是http的)
[解决办法]
要是完整1帧才能解开,从I帧才能解。你试下其它版本
我去年的时候也遇到这样的问题了,采用的是早点的版本
[解决办法]
要解实时H264码流,我的方法是,自己从socket接收,缓存,拼装H.264包,最后调用ffmpeg库解码;
如果从RTP收H.264数据,可根据RTP的marker字段判断:当marker==1时,将缓存H264数据拼包;当marker==0时,缓存。