[英]Mux video with my own audio PCM track
使用Android
MediaMuxer
,將自己的PCM軌道添加為最終電影中的音頻軌道的一種不錯的方法是什么?
在電影中,在特定時間,我正在放慢速度,停下來,然后加速並重新啟動視頻。 對於視頻部分,直接影響演示時間很容易,但是對於音頻,有一個逐塊的過程,這使得處理音軌的慢速,停止和開始變得不那么直觀。
當前,當遍歷從源頭收到的緩沖區時,為了減慢整個過程,我要做的是:
// Multiply by 3 the presentation time.
audioEncoderOutputBufferInfo.PresentationTimeUs =
audioEncoderOutputBufferInfo.PresentationTimeUs * ratio);
// I expand the sample by 3. Damn, just realized I haven't
// respected the sample alignment but anyway, the problem is not about white noise...
encoderOutputBuffer = Slowdown(encoderOutputBuffer, 3);
// I then write it in the muxer
muxer.WriteSampleData(outputAudioTrack, encoderOutputBuffer, audioEncoderOutputBufferInfo);
但是,這只是不起作用。 當然,如果將源中的MediaFormat
復制到目標,則其持續時間將比實際音頻數據短3倍。
我可以從輸入中獲取整個PCM
,編輯byte []數組,並將其作為軌道添加到MediaMuxer
嗎?
如果要放慢音頻樣本的速度,則需要在對它們進行編碼之前進行此操作,因此請先將音頻編解碼器的輸入緩沖區排隊。 根據我的經驗,在那里的大多數播放器都忽略了音頻演示時間戳(我在VLC和ffplay中嘗試過)。 如果要確保音頻和視頻保持同步,則必須確保實際上有足夠的音頻樣本來填補pt之間的空白,否則播放器將開始播放以下樣本,無論它們的pt如何。 此外,您不能僅使用MediaMuxer多路復用PCM樣本,您需要先對其進行編碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.