ffmpeg+RTP+H.264 总结

来源:互联网 发布:淘宝买家无理由退货 编辑:程序博客网 时间:2024/05/17 06:51

最近研究视频编解码,阶段性工作完成,在此总结。

参考资料:

(1) avplayer:一个编码风格与ffmpeg很相近的开源播放器库。      //读文件/BT/YK播放,不适用RTP流

(2)《MPEG-4/H.264视频编解码工程实践》    //用来扫盲,书中代码所用ffmpeg库太老了,造成马赛克。

(3) Ffmpeg-based_video_decompression :一个用来视频格式转换的开源小软件     //可参考,ffmpeg库也很老。

(4) RFC3984     //RTP 关于 h.264的承载格式,组包时用到


使用的ffmpeg版本:0.6.2


用到的ffmpeg函数:

avcodec_init();
avcodec_register_all();

avcodec_find_decoder(CODEC_ID_H264);

avcodec_alloc_context();       
avcodec_open(play->m_video_ctx, play->m_decoder);    


avcodec_alloc_frame();

 avcodec_decode_video(play->m_video_ctx,    
                                                avframe,
                                                &got_picture,
                                                (uint8_t *)pDec,
                                                buf_offset);

avpicture_get_size(PIX_FMT_YUV420P, play->m_video_ctx->width, play->m_video_ctx->height);

avpicture_fill((AVPicture*) &(*dst), buffer, PIX_FMT_YUV420P, play->m_video_ctx->width, play->m_video_ctx->height);

sws_getContext(play->m_video_ctx->width,
            play->m_video_ctx->height, play->m_video_ctx->pix_fmt,
            play->m_video_ctx->width, play->m_video_ctx->height,
            PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL);

sws_scale(play->m_swsctx, src->data, src->linesize, 0,
            play->m_video_ctx->height, dst->data, dst->linesize);
sws_freeContext(play->m_swsctx);

显示问题:

当解码第一帧完毕时,可以得到play->m_video_ctx->width和play->m_video_ctx->height。

在窗口显示主循环中,检测视频窗口是否初始化,如果未初始化,则得到width和height,并且重新根据视频实际大小,重新画屏。



参考:http://blog.csdn.net/smilestone322/article/details/7595755


2013年10月8日,补充:

如果使用较新版本的ffmpeg,解码函数有所变化:

avcodec_decode_video2(player->pCodecCtx, videoFrame, &gotPicture, &packet);

其中packet是一个AVPacket结构,在解码之前,需要把待解码的数据缓冲指给packet,形如:

      packet.data = buffer;
      packet.size = buffLen;