1 FFmpeg版本
FFmpeg 4.0+
2 問題描述
將序列的RGB視頻流通過ffmpeg h264編碼爲視頻文件通過vlc播放之後發現了一個奇怪的問題,就是視頻播放前面幾幀和原始RGB圖片一樣非常的清晰,當時越到後面,視頻越來越模糊。
3 解決方案
仔細參考完FFmpeg的示例代碼之後,發現在每壓入一幀數據就發現其將AVFrame 的pts都進行了自加操作,但是我的在代碼中沒有寫這一句代碼。
所以需要在壓入一幀視頻幀,編碼爲h264視頻數據後都需要自加AVFrame的pts,示例代碼如下:
int h264Encoder::EncoderRBGData(unsigned char * data, int length, AVPacket * pkt)
{
const int rgb_linesize[1] = { 4 * m_EncoderC->width };
// 垂直翻轉RGB數據
VerticalRotateRGBData(m_Width, m_Height, data, 4);
sws_scale(m_Scxt, (const uint8_t * const *)&data,
rgb_linesize, 0, m_EncoderC->height, m_pFrame->data,
m_pFrame->linesize);
m_pFrame->pts++;
// 編碼圖像
int ret;
int got_packet = 0;
av_init_packet(pkt);
ret = avcodec_send_frame(m_EncoderC, m_pFrame);
if (ret < 0) {
exit(1);
}
got_packet = avcodec_receive_packet(m_EncoderC, pkt);
if (!got_packet) {
return 1;
}
return -1;
}
參考上述代碼,最好在sws_scale編碼了m_pFrame之後,馬上對m_pFrame的pts進行自加操作,然後再進行編碼操作即使用avcodec_send_frame和avcodec_receive_packet。