14

2 つのオーディオ ファイルを用意し、プログラムでミックスして再生したいと考えています。最初のオーディオ ファイルを再生しているときに、しばらくして (動的な時間)、最初のオーディオ ファイルの途中で再生しているときに、最初のオーディオ ファイルに 2 番目の小さなオーディオ ファイルを追加する必要があり、最後に 1 つのオーディオとして保存する必要があります。デバイス上のファイル。2番目に含めたミキサーオーディオでオーディオファイルを再生する必要があります。

私は多くのフォーラムを調べましたが、これを達成する方法を正確に知ることができませんでしたか?

誰かが私の以下の疑問を明確にしてもらえますか?

  1. この場合、どのオーディオ ファイル/フォーマットを使用すればよいですか? .avi ファイルを使用できますか?
  2. プログラムで最初のオーディオ ファイルに設定された動的時間の後に 2 番目のオーディオを追加する方法は? 例: 最初のオーディオの合計時間が 2 分の場合、最初のファイルの 1 分または 1.5 分または 55 秒のどこかに 2 番目のオーディオ ファイル (3 秒のオーディオ) をミックスする必要があるかもしれません。そのダイナミック。
  3. 最終出力オーディオ ファイルをデバイスに保存する方法は? プログラムでオーディオ ファイルをどこかに保存した場合、もう一度再生できますか?

これを達成する方法がわかりません。あなたの考えを提案してください!

4

4 に答える 4

6
  • 各音声ファイルを開く
  • ヘッダー情報を読む
  • 各ファイルの int の配列として生の非圧縮オーディオをメモリに取得します。
  • file2 でミックスしたいファイル 1 の配列のポイントから開始し、ループして file2 の int 値を file1 の値に追加し、最大値より上または下の値を必ず「クリップ」します (これがオーディオをミックスする方法です...はい、それとても簡単です)。file2 が長い場合は、file2 の残りの部分を完全に保持するのに十分な長さの最初の配列を作成する必要があります。
  • 新しいヘッダー情報を書き込み、次に file2 を追加した配列からオーディオを書き込みます。
  • 圧縮が必要な場合、またはファイルがメモリに収まらない場合は、より複雑なバッファリング スキームを実装する必要があります。
于 2012-01-03T21:34:57.477 に答える
2

この場合、どのオーディオファイル/フォーマットを使用する必要がありますか?.aviファイルを使用できますか?

圧縮形式または非圧縮形式を選択できます。一般的な非圧縮形式には、WavとAIFFが含まれます。CAFは、圧縮データと非圧縮データを表すことができます。.aviはオプションではありません(OSによって提供されます)。

ファイルが大きく、(ディスク上の)ストレージスペースが問題になる場合は、CAF(または単に.m4a)に保存されたAAC形式を検討してください。ほとんどのアプリケーションでは、16ビットのサンプルで十分です。また、これらのファイルを適切なサンプルレートで保存することで、スペース、メモリ、CPUを節約できます(参照:CDは44.1kHzです)。

ExtAudioFileインターフェースは変換プロセスを抽象化するため、プログラムを変更して、ディストリビューションの圧縮形式と非圧縮形式のサイズと速度の違いを比較する必要はありません(通常のアプリケーションでは、CAFのAACで問題ありません)。

非圧縮CD品質のオーディオは、チャネルごとに1分あたり約5.3MBを消費します。したがって、それぞれ3分の長さの2つのステレオオーディオファイルと3分の宛先バッファがある場合、メモリ要件は約50MBになります。

「数分」のオーディオがあるため、すべてのオーディオデータを一度にメモリにロードしないようにすることを検討する必要があるかもしれません。オーディオを読み取り、操作し、組み合わせるには、メモリ内で機能する非圧縮表現が必要になるため、ここでは圧縮形式は役に立ちません。同様に、圧縮された表現をpcmに変換するには、かなりの量のリソースが必要です。圧縮ファイルの読み取りは、バイト数は少なくなりますが、より多くの(またはより少ない)時間がかかる可能性があります。

プログラムで最初のオーディオファイルに設定された動的時間の後に2番目のオーディオを追加するにはどうすればよいですか?例:最初のオーディオの合計時間が2分である場合、2番目のオーディオファイル(3秒のオーディオ)を最初のファイルの1分または1.5分または55秒のどこかにミックスする必要がある場合があります。そのダイナミック。

ファイルを読み取り、使用する形式に変換するには、ExtAudioFile APIを使用します。これにより、目的のサンプル形式に変換されます。メモリ内の一般的なPCMサンプル表現には、、、およびが含まれますSInt32SInt16floatこれはアプリケーションとハードウェア(iOS以外)によって大きく異なる可能性があります。ExtAudioFile APIは、必要に応じて、圧縮形式をPCMに変換します。

入力オーディオファイルのサンプルレートは同じである必要があります。そうでない場合は、オーディオをリサンプリングする必要があります。これは、多くのリソースを必要とする複雑なプロセスです(正しく/正確に行われた場合)。リサンプリングをサポートする必要がある場合は、このタスクを完了するために割り当てた時間を2倍にします(ここではプロセスの詳細は説明しません)。

サウンドを追加するには、ファイルからPCMサンプルを要求し、処理して、出力ファイル(またはメモリ内のバッファ)に書き込みます。

他のサウンドをいつ追加するかを決定するには、(ExtAudioFileGetPropertyを介して)入力ファイルのサンプルレートを取得する必要があります。55秒で2番目のサウンドを宛先バッファーに書き込みたい場合は、サンプル番号SampleRate * 55でサウンドの追加を開始します。ここで、SampleRateは、読み取っているファイルのサンプルレートです。

オーディオをミキシングするには、次のフォーム(擬似コード)を使用します。

mixed[i] = fileA[i] + fileB[i];

ただし、オーバーフロー/アンダーフローやその他の算術エラーを回避する必要があります。通常、浮動小数点の計算には時間がかかる可能性があるため(非常に多い場合)、整数値を使用してこのプロセスを実行します。一部のアプリケーションでは、オーバーフローの心配なしにシフトして追加することができます。これにより、追加する前に各入力を効果的に半分に減らすことができます。結果の振幅は半分になります。ファイルのコンテンツを制御できる場合(たとえば、ファイルがすべてリソースとしてバンドルされている場合)、ファイルのピークサンプルがフルスケール値の半分(約-6dBFS)を超えないようにすることができます。もちろん、floatとして保存すると、CPU、メモリ、およびファイルのI / O要求が高くなるという犠牲を払って、この問題が解決されます。

この時点で、2つのファイルを読み取り用に開き、1つを書き込み用に開いてから、出力ファイルに書き込む前に入力を処理およびミキシングするためのいくつかの小さな一時バッファーを用意します。効率を上げるために、これらの要求をブロック単位で実行する必要があります(たとえば、各ファイルから1024サンプルを読み取り、サンプルを処理し、1024サンプルを書き込みます)。APIは、効率のためのキャッシングとバッファリングに関して多くを保証しません。

最終出力オーディオファイルをデバイスに保存するにはどうすればよいですか?プログラムでオーディオファイルをどこかに保存した場合、もう一度再生できますか?

ExtAudioFile APIは、読み取りと書き込みのニーズに対応します。はい、後で読んだり再生したりできます。

于 2012-01-03T22:24:35.217 に答える
0

一度に複数のサウンドを再生する場合は、必ず*.caf形式を使用してください。一度に複数の音を鳴らす場合におすすめです。プログラムでそれらをミックスするという点では、私はあなたがそれらを同時にプレイしたいだけだと思います。一方のサウンドの再生中に、もう一方のサウンドにいつでも再生するように指示します。特定の時間を設定するには、NSTimer(NSTimer Class Reference)を使用して、タイマーが起動したときにサウンドを再生するメソッドを作成します。

于 2011-12-30T21:11:47.690 に答える