9

映画 (.m4v) を録音しているときにオーディオのピッチを変更しようとしているアプリを書いています。または、後でムービーのオーディオ ピッチを変更します。最終結果は、元の長さ (つまり、元と同じビジュアル) のムービー (.m4v) になりたいのですが、音のピッチが変更されています (たとえば、「シマリスの声」)。可能であれば、リアルタイム変換が優先されます。

私は iOS でのオーディオ ピッチの変更について多くのことを読みましたが、ほとんどの例は再生、つまり異なるピッチでサウンドを再生することに焦点を当てています。

私のアプリでは、ムービー (.m4v / AVFileTypeQuickTimeMovie) を記録し、標準の AVAssetWriter を使用して保存しています。ムービーを保存するときに、オーディオを操作しようとした次の要素にアクセスできます (たとえば、ピッチを変更します)。

  • オーディオ バッファ (CMSampleBufferRef)
  • オーディオ入力ライター (AVAssetWriterAudioInput)
  • オーディオ入力ライター オプション (例: AVNumberOfChannelsKey、AVSampleRateKey、AVChannelLayoutKey)
  • アセットライター (AVAssetWriter)

上記のオブジェクトにフックしてオーディオ ピッチを変更しようとしましたが、成功しませんでした。

ここで説明されているように、Dirac でも試してみました: Real Time Pitch Change In iPhone Using Dirac
And OpenAL with AL_PITCH as here: Piping output from OpenAL into a buffer
And the "BASS" library from un4seen: Change Pitch/Tempo In Realtime

上記のライブラリのいずれでも成功していません。おそらく、それらの使用方法と、オーディオ保存コードにフックする場所がよくわからないためです。

同様の効果を持つライブラリがたくさんあるようですが、再生またはカスタム録音コードに焦点を当てています。既に取得しているオーディオ ストリーム (AVAssetWriterAudioInput) を操作したり、保存したムービー クリップ (.m4v) を変更したりしたいと考えています。ビデオを視覚的に変更しないでください。つまり、同じ速度で再生します。しかし、オーディオを速くしたり (シマリスのように) 遅くしたり (... モンスターのように) したいですか?

ピッチをリアルタイムで (ムービーの録画時)、または後でムービー全体 (.m4v ファイル) を変換して変更する方法について何か提案はありますか? Dirac、OpenAL、SoundTouch、BASS、またはその他のライブラリをさらに調べる必要がありますか?

オーディオを変更して他のユーザーとムービーを共有できるようにしたいので、再生のみのピッチ変更に頼ることはできません。

4

2 に答える 2

3

さて、ディラックが間違いなくそのトリックを行うと私は安全に言うことができます. 私はそれを使用しましたが、機能します。

ビデオ処理の経験はあまりありませんが、ある時点でオーディオトラックを分離できれば、それは簡単なことです.

  1. それができる場合は、ファイルに保存し、ディラックのサンプル コードをタイム ストレッチで使用するだけです。それは言われていませんが、ピッチ シフトも行います。3 つのパラメータを設定して、オーディオを変換します (タイム ストレッチ ファクター、ピッチ シフトでセント/トーン*およびフォルマント シフト)。

  2. ファイルに保存したくない場合は、PCM に変換して Audio Units で DSP を実行してください。正直なところ、それを行うには数学とオーディオ処理に関する深刻な知識が必要ですが、必要なものを提供する優れたサンプルプロジェクトがたくさんあります (github (AudioGraph by Tom Zic))。あなたの仕事でそれらすべての開発者コードに言及してください。

さらに、PCM に変換できる場合は、この段階で、オーディオ ユニット グラフ上でライブまたはサンプル コードを使用して非圧縮オーディオにディラックを適用し、ディラックが使用する EAFReader を使用する代わりに、バッファ データをピッチシフトを実行するために使用するバッファ。そこで少し魔法をかける必要があるかもしれませんが、ピッチ シフトの独自の DSP 実装を作成するほど劇的ではありません。

要するに、AVFoundation にビデオのみを処理するように依頼できれば、オーディオ ユニットのライブ処理を実行してコールバックを設定できるので、処理するたびに、処理されたデータをファイルまたはおそらく avassetwriter に渡すことができます。この最後のピースが可能かどうかはよくわかりません。それが不可能な場合の解決策は、ビデオとオーディオを別々に同期して保存することですが、両方が同時にディスクに書き込もうとするため、大きな問題になると想像できます。どうなるか教えてください、私は今興味をそそられています。

于 2012-08-27T16:18:06.557 に答える
1
  • 最初に行う必要があるのは、mp4 ストリームからオーディオを分離することです。これを実現するには、デマルチプレクサ (略してデマルチプレクサ) が必要です。MainConcept SDKを見てください。これらは多数のフォーマットをサポートしています。
  • 2 つ目は、圧縮されたオーディオをフォーマットから生の PCMにデコードする必要があります。
  • 次に、いくつかのライブラリを使用して生のオーディオをピッチシフトします。
  • 次に、ピッチシフトされたオーディオを圧縮形式にエンコードする必要があります。
  • そしてmp4に戻します。

デコードとエンコードが原因で、プロセス中にオーディオ品質がいくらか失われます。あなたのビデオは同じままです。

于 2013-03-21T20:55:11.733 に答える