2012-06-11 44 views
8

我正在編寫一個應用程序,我在錄製電影(.m4v)時試圖改變音頻的音高。或者之後修改電影的音頻音調。我希望最終結果是具有原始長度(即與原始相同的視覺)但具有修改的聲音音高的電影(.m4v),例如,一個「花栗鼠聲音」。如果可能的話,實時轉換是首選。修改錄製剪輯的音頻音高(m4v)

我已經閱讀了很多有關在iOS中更改音頻音調的內容,但大多數示例都關注播放,即以不同的音調播放聲音。

在我的應用程序中,我正在錄製電影(.m4v/AVFileTypeQuickTimeMovie)並使用標準AVAssetWriter進行保存。當保存的電影,我有機會獲得以下元素,其中,我試圖操縱音頻(例如修改間距):

  • 音頻緩衝(CMSampleBufferRef)
  • 音頻輸入作家(AVAssetWriterAudioInput)
  • 音頻輸入作家選項(例如AVNumberOfChannelsKey,AVSampleRateKey,AVChannelLayoutKey)
  • 資產作家(AVAssetWriter)

我試圖掛鉤到上述目的來修改AUD io球場,但沒有成功。

我也有試過狄拉克如下所述:Real Time Pitch Change In iPhone Using Dirac
正如這裏所描述的OpenAL與AL_PITCH:Piping output from OpenAL into a buffer
而從un4seen的「BASS」庫:Change Pitch/Tempo In Realtime

我還沒有發現與成功任何上述庫,很可能是因爲我真的不知道如何使用它們,以及將它們掛接到音頻保存代碼的位置。

似乎有很多圖書館有類似的效果,但側重於播放或自定義記錄代碼。我想操作已經獲得的音頻流(AVAssetWriterAudioInput)或修改已保存的影片剪輯(.m4v)。我希望視頻在視覺上不變,即以相同的速度播放。但我希望音頻更快(像花栗鼠)或更慢(像一個......怪物?)

你有什麼建議,我可以實時(錄製電影時)或之後修改音調通過轉換整個電影(.m4v文件)?我應該進一步觀察Dirac,OpenAL,SoundTouch,BASS或其他庫嗎?

我想能夠與修改後的音頻共享電影給他人,這就是原因我不能只靠修改音調來播放只有

回答

3

好的,我可以放心地說,迪拉克將明確做到這一點,我已經使用它,它的確行得通的

我沒有太多的視頻處理經驗,但如果在某個時候你可以隔離音軌它是一塊蛋糕。

  1. ,如果你能做到這一點,那麼只需將它保存到一個文件中,並使用狄拉克的示例代碼的時間伸縮,它並沒有說出來,但它也不會變調,你設定了三個參數應用到轉換音頻(時間伸縮因子,音調轉換以分/音*和共振峯轉換)。

  2. 如果你不想將它保存到一個文件,那麼只需將它轉換爲PCM,並在音頻單元上做一些DSP。說實話,你需要一些關於數學和音頻處理的認真知識才能做到這一點,但是有很多很好的示例項目(github(Tom Zic的AudioGraph))會爲你提供所需的東西,別忘了在你的工作中提及所有這些開發代碼。

此外,如果能變換爲PCM,在這個階段就可以可選地應用狄拉克到未壓縮的音頻或者住在音頻單元圖形或通過使用他們的示例代碼和,而不是使用EAFReader狄拉克使用,只是將您的緩衝區數據傳送到它用來執行音高切換的緩衝區。你可能需要在那裏做一點魔法,但不像寫自己的DSP實現音高轉換那麼戲劇化。底線,如果你可以要求AVFoundation照顧視頻,那麼你可以做音頻單元實時處理和設置回調,所以每次它處理它,你可以將處理後的數據傳遞給一個文件或可能傳遞給你avassetwriter,我不太確定這個最後的作品是否可能。如果這是不可能的,那麼解決方案是單獨同步並保存視頻和音頻,但我可以想象這是一個巨大的問題,因爲它們都會嘗試同時寫入磁盤。請讓我知道它是怎麼回事,我現在很感興趣。

1
  • 您需要做的第一件事是demux來自mp4流的音頻。您將需要一個解複用器(簡稱解複用器)來實現此目的。看看MainConcept SDKs,他們支持一堆格式。
  • 第二你需要解碼你的壓縮音頻,從任何格式它是原始的PCM。
  • 然後使用一些庫到音高轉換的原始音頻。
  • 接下來你需要編碼音高偏移的音頻回壓縮格式。
  • MUX回MP4。

你會因爲解碼編碼的過程寬鬆一些音頻質量。您的視頻將保持不變。