FFmpeg - 通過h264編碼的視頻文件開始很清晰後面逐漸模糊

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。

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