私は、MediaCodecを使用してビデオファイルのオーディオトラックに参加することができました。両方のオーディオトラックのチャンネル数とサンプルレートが同じであれば問題ありません。48kHzから44.1kHzへのAndroidのリサンプリング、純粋なJava、またはOpenSL ES?
(オリジナルトラックが22050ヘルツであり、元のトラックが24000ヘルツであれば48000 Hzの2チャンネルオーディオを出力する場合は、何らかの理由でOMX.SEC.aac.dec
は常に44100 Hzの2チャンネルオーディオを出力する。)
問題が登場私は22050Hzのオーディオトラックの後に24000Hzのオーディオトラックを追加しようとします。上記の両方のトラックからなる22050 Hzのオーディオトラックを出力したいと思えば、私は24000 Hzのオーディオをリサンプリングする必要があります。
私はこれを試してみました:
private byte[] minorDownsamplingFrom48kTo44k(byte[] origByteArray)
{
int origLength = origByteArray.length;
int moddedLength = origLength * 147/160;
int delta = origLength - moddedLength;
byte[] resultByteArray = new byte[moddedLength];
int arrayIndex = 0;
for(int i = 0; i < origLength; i+=11)
{
for(int j = i; j < i+10; j++)
{
resultByteArray[arrayIndex] = origByteArray[j];
arrayIndex++;
}
}
return resultByteArray;
}
これは、3700-何かがバイトと非常に大きなスクランブル音の背後にエンコード...後に正しいオーディオのバイト配列を返します。
私の質問:
- どのように私が正しく、このようなアーティファクトを残さずにオーディオトラックをダウンサンプリングしますか?私は平均値を使うべきですか?
- OpenSL ESを使用して実装されたリサンプラを使用して、処理を高速かつ/またはより良くする必要がありますか?
データはおそらく16ビットですが、特に2つのチャンネルの場合は、データからバイトをスキップできません。また、適切に処理したい場合は、エイリアシングアーチファクトなどがないことを確認するために最終結果をフィルタリングする必要があります。しかし、私は最初の部分が主な問題だと思います。 40バイトをコピーして4をスキップすると、それが解決される可能性があります。 –
16ビットでアップサンプリングされています(ソースは22050 Hzのサンプルレートを持ち、デコーダの出力は44100 Hzでした)。とにかく、このフィルタをJavaでサンプルごとにどのように適用するのですか? – Gensoukyou1337
40バイトをコピーして4つの作業をスキップしますが、最終出力ビデオのオーディオはビデオ全体をより遅い速度で再生します。 – Gensoukyou1337