2010-07-08 20 views
1

因此,如何創造的東西這將有這樣的事情在它的API:如何爲FFmpeg lib創建函數以將幀編碼爲任何(可能的)格式?

Encoder = EncoderFormat(format name); // prepare encoder 
//...code for frames generation... now we want to encode frame!// 
EncodeFrame(const CImage* src, void* dest, int* is_keyframe, more args if needed); 

這可能嗎?請任何人提供一個簡單的例子來說明如何創建這樣的事情?

回答

1

如果不借助於非常糟糕的編程實踐,如全局變量,這是不可能的。幀的編碼不是獨立的;編碼器必須保持每次必須將指針傳遞給編碼器功能的狀態(上下文)。將格式選擇傳遞給EncodeFrame的想法也相當愚蠢,因爲如果不關閉現有的編碼器上下文並切換到新的格式,則無法選擇每幀格式。

除非源圖像已經是編碼器想要的格式(可能是YUV 4:2:0),否則您的包裝將需要將其轉換。這可以自己完成,也可以使用ffmpeg的libswscale。您還需要爲每個幀提供一個時間戳。如果你想要一個簡單的API,你不必擔心那些東西,你可能想要包裝AV編解碼器上下文指針libavcodec給你另一個結構,你保持你的運行時間戳值,swscale上下文指針等。

除此之外,您的API無法指定目標緩衝區的大小,因此它是完全不安全的。將指針返回內部緩衝區(通過返回值或指針指針參數)以及編碼的幀大小可能會更好,而不是寫入調用方的緩衝區。

+0

一般來說,當我要求這樣的api時,我會對我喜歡看到它的一些抽象(概括)進行補充。這種「簡單」API將不安全。這對我來說可以,因爲我不打算製作一些超酷的真實世界程序 - 我只需要簡單的工具來編碼我創建的幀(創建幀是我真正感興趣的)...所以我的觀點是 - 如果它不安全或不好的做法 - 好的 - 讓我們試試吧!當然,如果它會壓制PC我不會很高興,但如果它能做到它的jub我會很高興有我的原型。 – Rella 2010-07-08 07:07:03

相關問題