最近研究視頻編解碼,階段性工作完成,在此總結。
參考資料:
(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;