首先,請您用繩子(或其他)地圖AVCodecID,像這樣:
std::map<string, AVCodecID> _codecList;
_codecList["h264"] = AV_CODEC_ID_H264;
_codecList["mpeg4"] = AV_CODEC_ID_MPEG4;
....
注意FFmpeg的不提供信息是哪種編解碼器在什麼容器可用,因此,你應該確認自己。但你可以參考以下鏈接(至少是officlal):https://en.wikipedia.org/wiki/Comparison_of_video_container_formats
接下來要做的就是通過名稱找到編碼器,或AVCodecID在下面的代碼:
avcodec_find_encoder_by_name("libx264");
avcodec_find_encoder(AV_CODEC_ID_H264);
兩者都是回報avcodec中*
AVCodecID codec_id = (_codecList.find("h264") != _codecList.end()) ?
_codecList.find("h264") : AV_CODEC_ID_NONE;
if(codec_id == AV_CODEC_ID_NONE)
{
return -1;
}
AVCodec* encoder = avcodec_find_encoder(codec_id);
// or you can just get it from avcodec_find_encoder_by_name("libx264");
AVStream* newStream = avformat_new_stream(avFormatContext, encoder);
THRE確定視頻質量時,有這麼多的事情:這樣你就可以撥打電話時avformat_new_stream(),像這樣使用。 X264,特別是有更多的選擇。在這種情況下,您可以通過crf值或比特率來列出它(不能同時使用這兩個選項)。你可以用AVCodecContext來確定它。
AVCodecContex* codec_ctx = newStream->codec;
codec_ctx->bitrate = 1000000 // 1MB
// codec_ctx->qmin = 18;
// codec_ctx->qmin = 31;
一旦你做了,與avcodec_open2
avcodec_open2(avFormatContext, encoder, NULL);
打開它,不要忘了,當你釋放它關閉。
avcodec_close(avFormatContext);
創建自己的輸出流時有很多事情要做。如果你有更深的經驗,我認爲這個答案就足夠了。
,但如果你沒有太多的經驗與FFmpeg的,你可以找到我的完整的例子在這裏(https://github.com/sorrowhill/FFmpegTutorial)
謝謝,但有沒有辦法來自動獲取解壓安裝的名單? – david
我認爲這是不可能的。因爲有很多用於壓縮視頻或音頻的編解碼器。也許你可以數一數如果你正在使用包裝軟件,如FFmpeg。 –