ffmpeg解码h264图像帧:av_parser_parse2()//解码不拷贝数据问题!

风之水2003 2014-02-21 05:43:30
char buf[2048*500],*curr_264_nalu_ptr;
AVCodec *avCodec;
AVCodecParserContext *avParserContext;
AVCodecContext *avContext;
AVFrame *avFrame;
uint8_t* avBuf;
//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);

{
//获取一帧h264图像数据

}
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 ,
AV_NOPTS_VALUE, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
curr_264_nalu_ptr += len;
curr_264_nalu_size -= len;

int got_picture=0;
if( buf_len == 0 )
{
AVPacket avpkt = {0};
av_init_packet(&avpkt);
avpkt.data = buf;
avpkt.size = buf_len;

avcodec_decode_video2(avContext, avFrame, &got_picture, &avpkt);
if( got_picture )
{
if (!avFrame->data[0]) return nil;
[self convertFrameToRGB];
return [self imageFromAVPicture:picture width:outputWidth height:outputHeight];
}
}
//release memery
...
return 0;
}
在av_parser_parse2处理后buf为空,buf_len为0,这样处理有问题吗?大神帮帮忙。。。数据是通过网络接收的h264帧(完整的一帧数据,可以转换成一副图像,以前的代码可以解码出图像,但是不支持1080p。。。所以想用ffmpeg解码),
...全文
5171 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
BunnyC254 2016-04-07
  • 打赏
  • 举报
回复
为什么你们的实时解码都没有拼帧的问题 rtp经常会分很多次传送一帧图像 而ffmpeg传人的数据必须是完整的一帧啊
jacknian 2015-06-10
  • 打赏
  • 举报
回复
楼主,能分享一份代码么,只要解码这一块的,我用的rtmp服务器返回的h264流数据,用ffmpeg解码遇到了你遇到的问题
风之水2003 2014-09-19
  • 打赏
  • 举报
回复
还要感谢@wangweifly111童鞋的帮助,下面的链接是他解决问题的依据 http://blog.yikuyiku.com/?p=3486#comments
funphchen 2014-07-09
  • 打赏
  • 举报
回复
楼主是怎样解决了? 我现在也遇到这个问题了。求助啊。
风之水2003 2014-03-14
  • 打赏
  • 举报
回复
h264解码好麻烦。。。,没搞明白,图像大小不是通过数据解出来的吗?
__cc__ 2014-02-26
  • 打赏
  • 举报
回复
引用 3 楼 styyzxjq2009 的回复:
是这点的问题吗?这个是输出图像的大小,原始图像大小不是在NAL中吗
、 你原始图像是1920*1080,解码出来难道变成了720*576?解码可没有下变换功能 解码1080p肯定要用1920*1080的缓冲区去接收啊,缓冲区小了,自然收不到解码数据了。
风之水2003 2014-02-26
  • 打赏
  • 举报
回复
是这点的问题吗?这个是输出图像的大小,原始图像大小不是在NAL中吗
__cc__ 2014-02-24
  • 打赏
  • 举报
回复
呵呵,你既然是解码1080P的视频,怎么分配576i的内存呢。。。
风之水2003 2014-02-24
  • 打赏
  • 举报
回复
数据部分是这样开头的 00 00 00 01 41 9A 44 02 E6 34 BE 1C 61 9F F2 A2 EE EE F8 F8 D3 80 AF A3 CC A1 34 CD 8E 35 EA 74 8C B1 6E C6 66 C0 2B 43 D5 9D 16 8F BC 4D B2 32 98 9F 1E 0D 08 DE BC AE 5F E3 F2 28 9B A9 CF 05 DF FF 78 73 69 58 7D 09 74 1F AB DF 25 6B 27 2F 02 56 97 5F 9D 27 C9 46 43 12 5F EE 7A 48 2C FD 3B AE 08 B0 97 96 82 B0 F3 DE 84 F9 2D 1E BE 4F DB 90 38 2F 87 4C 6F 0D E5 BC BD D4 F8 BE 35 B4 C9 F7 67 B3 1E 7C 7C 23 E6 FA 06 28 01 AF A6 B8 BF F0 87 6B CF 6A 3F 72 20 5E E6 C4 3B E6 98 91 87 97 A5 05 72 CB 75 EE 6C 30 99 7F 17 0E 2B 65 F9 A9 F9 63 8C A7 F9 AE 32 F3 04 E6 E5 6B 11 55 E3 A3 30 96 2E 9B 1F 3E C5 5E B3 FE 31 E4 95 DC BC 87 5C 5C 65 AB 07 B7 01 D9 F1 69 D8 97 E2 3C 4C 5C 83 11 C6 4B E4 CF CD 3D 3F 8B 8C 32 2E BC 83 1A F8 46 95 C7 65 0D 67 CC 1D 56 E3 5F 84 3D 94 A0 7F 73 08 6F 1B 22 38 95 F5 B8 B8 CE 71 DC B4 00 31 1D A3 E9 EF FB C3 4F 07 E1 1C 38 EC EA 8D FB 9D 03 2F A7 EB AA 00 AE 84 BD 3F D6 DB FA D4 67 F8 1F CC DA 07 65 DC C9 BF 0F 67 D3 20 FC 7C A7 C2 77 F4 E2 76 5A 71 FF 2F FA 87 A1 09 46 4C F6 ......................................................... 上面的流程有问题吗,大神们指点下哈~

4,446

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧