2015-11-27 85 views
1

我正在使用Android相機實現視頻錄製。我使用MediaCodec來編碼來自onPreviewFrame()回調的幀。在Android上使用MediaCodec錄製慢動作視頻

現在我想錄制慢動作視頻。 如何設置相機捕捉速率或幀速率?我可以在哪裏設置這些參數,例如,如果我想以120fps記錄,並以30fps播放?

以下是我已經研究:

我記錄MOTO X慢動作視頻(具有內置慢動作錄像功能),並使用FFmpeg的檢查其FPS。我發現它在110 fps(接近120fps)的記錄和30fps的回放。這證明它提供硬件支持以高fps記錄。

然而,當我使用getSupportedPreviewFpsRange檢查其支持的FPS範圍內,只有4個支持FPS範圍套無人超過30fps的更大:

min_fps:15.0,max_fps15.0

min_fps :15.0,max_fps20.0

min_fps:15.0,max_fps30.0

min_fps:24.0,max_fps30.0

我用setPreviewFpsRange來設置更高的fps,但它仍然不超過30fps。我也嘗試設置KEY_FRAME_RATE和KEY_CAPTURE_RATE MediaFormat。但它仍然不起作用。

我也搜索了solution通過設置CamcorderProfile或setVideoFrameRate與MediaRecorder。但我正在使用MediaCodec。

任何人都可以幫我解決這個問題嗎?

回答

0

用於慢速錄製。

mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_LOW);

用於高速記錄。

mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_HIGH); 
+0

這是MediaRecorder,而不是MediaCodec。 – fadden

+0

感謝您的回答。你真的嘗試用它來記錄慢動作視頻嗎?我確實嘗試過使用MediaRecorder。但它仍然沒有工作。 –

+0

你好,謝謝你的回答,你知道一個已經捕捉到120幀/秒速率的安卓相機應用程序(第三方)嗎?謝謝 –

2

以較高速率捕獲視頻幀不能解決問題。如果您以120fps捕捉並以120fps回放,則可以以正常速率播放高速視頻。

你想要做的是修改時間戳。 MediaCodec支持VFR(可變幀頻)視頻。而不是花費1秒錄製60幀,以30fps的速度播放,您將錄製每秒30幀,以15fps播放。

由MediaCodec的AVC編碼器生成的H.264流根本不包括時間戳。將輸出提供給MediaMuxer時,可以爲每個幀指定時間戳,生成.mp4文件。大多數示例代碼只需要從Camera獲取的時間戳,並將其通過MediaCodec傳遞給MediaMuxer,但您可以對其進行調整。你唯一不能做的就是讓時間戳落後。

如果你看看「八卦」電影是generated in Grafika的方式,你可以看到它使用輸出時間戳來使電影播放更慢或更快。

在不改變幀頻的情況下完成同一件事的另一種簡單方法是將幀加倍。對於慢動作部分,只需將相同的幀多次傳送給編碼器即可。同樣,您需要調整每幀的演示時間戳,但您的視頻將具有一致的30fps。 (如果你插入了幀,它會更好看,但這會更難。)

+0

感謝您的回答!但我認爲以15fps播放的視頻可能會有些滯後。如果以60fps或更高的頻率拍攝視頻,並以30fps播放視頻似乎是更好的選擇。我真的很想知道是否有什麼方法能夠以更高的幀率真正錄製視頻? –

+0

@ZebinXu:這是由視頻源(即相機)而不是MediaCodec決定的。要獲得30fps的慢動作,您需要告訴相機將幀捕獲速率提高一倍,同時修改提供給MediaMuxer的時間戳。 MediaCodec在幀定時中唯一有興趣的是試圖將流比特率限制爲一個特定的值......如果你說你想要8Mbps,它需要能夠告訴一秒鐘內出現多少幀,並且它可以使用幀時間戳來解決這個問題。 – fadden

+0

是的,謝謝。但我的觀點是,爲什麼我無法使用硬件高速率捕獲支持的設備中的API或其他代碼捕獲高速率視頻? –

相關問題