2012-11-22 25 views
2

我編碼實時渲染視頻內容,MPG和/或MP4的使用ffmpeg的C API(取決於視頻的後期使用)。當編碼爲MP4,一切都很好。但是,當編碼爲mpg時,所得到的視頻不能由任何播放器播放。快速調用ffprobe可以發現頭部缺失。但是這似乎幾乎不可能,因爲我明確地寫了它。頭在MPG失蹤,儘管使用avformat_write_header

這是我怎麼寫的標題,被編碼的任何幀之前:

// ptr->oc is the AVFormatContext 
int error = avformat_write_header(ptr->oc, NULL); 
if (error < 0) 
{ 
    s_logFile << "Could not write header. Error: " << error << endl; 
    fprintf(stderr, "Could not write header. Error: '%i'\n", error); 
    return 1; 
} 

有寫頭的時候從來沒有任何錯誤。

對於編碼,我下面the official muxing.c example的,所以我設置CODEC_FLAG_GLOBAL_HEADER標誌。我使用CODEC_ID_MPEG2VIDEO(用於視頻)和CODEC_ID_MP2(用於音頻)。

結果MPG不工作時,我「編碼」它與外部的ffmpeg可執行這樣的附加步驟:「的ffmpeg -i ownEncoded.mpg -sameq -y working.mpg」。 因此,似乎所有的數據是存在的,只有標題是缺少某種原因...

這裏是唯一的ffmpeg之前報告/寫頭時:

mpeg ------------------- 
lvl: 24 
msg: VBV buffer size not set, muxing may fail 

莫非是問題?

我不知道什麼可能是錯在這裏,我的MP4編碼具有完全相同的功能,除了編碼的MP4時設置像Q最小,最大尿流率,me_method等一些特殊的價值。我可能必須設置任何特殊值,以便ffmpeg確實能夠正確寫入標題?

+1

指定您正在使用的格式/ vcodec/acodec。 「MPEG」/ 「mpeg1video」/ 「MP2」? – pogorskiy

+0

這是mpeg2video/mp2。將它添加到問題中。 – TheSHEEEP

+0

哦,我的!原來我有一個錯誤導致CODEC_ID_MPEG2VIDEO沒有正確設置,而是使用H264。感謝提示,這讓我再次看到它:) – TheSHEEEP

回答

1

哦,我的!

原來我有導致CODEC_ID_MPEG2VIDEO沒有正確設置,而不是使用H264作爲默認的一個錯字。當然這在.mpg裏面不好。

感謝評論中的提示,這讓我再次看到它! :)

2

也許你必須設置標誌CODEC_FLAG_GLOBAL_HEADERAVCodecContext。 這是必要的情況下outputFormat->oformat->flags & AVFMT_GLOBALHEADER == true,其中outputFormatAVOutputFormat

因此,你應該寫

if(outputFormat->oformat->flags & AVFMT_GLOBALHEADER) 
    codec->flags |= CODEC_FLAG_GLOBAL_HEADER; 

還必須看到ffmpeg的輸出,也許有警告。

+0

我確實設置了這個標誌,因爲我遵循muxing.c示例。我會將該信息添加到原始問題:)我還將添加ffmpeg正在報告的內容。 – TheSHEEEP