ffmpeg+RTP+H.264 總結

最近研究視頻編解碼,階段性工作完成,在此總結。

參考資料:

(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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章