FFmpeg 2.0 atempo変速オーディオノイズ発生とSoundTouchオーディオ変速実現

1979 ワード

改訂:2017.3.622:51
チームテストによると、FFmpeg 0.10.16「Freedom」に基づくatempoフィルタ変速オーディオは、開始時に顕著なノイズ(ci ci音)がなく、特に低速の場合、トランスコードコマンドは以下の通りである.FFmpeg 2にアップグレード.x及びFFmpeg 3.x,同じ操作で音質が著しく悪くなる.
ffmpeg -i source.wav -filter:a "atempo=0.5, atempo=0.5" -vn destination.wav

失敗したNDKは直接AVFilterモジュールを翻訳して試みます


FFmpeg 0.10.16のAVFilterモジュールを直接NDKでコンパイルしてみると、依存関係が複雑なため、libavcodec、libavformatなどのモジュールを引用したファイルも少なくなく、処理には大きな作業量が必要です.

SoundTouchを試してみる


簡単にするため、SoundTouch Audio Processing Libraryを使用してオーディオ変速を実現します.WAV形式のみをサポートしており、FFmpegでAACなどのデータを復号してから処理することができます.SoundTouchが使用するオーディオ処理アルゴリズムは、Time and pitch scaling in audio processingを参照しており、FFmpegと同様にwsolaアルゴリズムが使用されている.
SoundTouchソースをダウンロードし、sourceディレクトリにAndroidプロジェクトAndroid-libがあり、Applicationにあります.mkではAndroidバージョンは定義されておらず、具体的なバージョンの内容はAndroid Manifestに書かれている.xml.実際には、ndk-buildを実行するときに次のログがあるため、NDKを指定したバージョンにコンパイルすることはありません.
Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 11 in /soundtouch/source/Android-lib/AndroidManifest.xml

ダイナミックライブラリにコンパイルする必要があるため、Application.mkはバージョン情報を追加した.
APP_PLATFORM := android-11

コンパイルされたダイナミックライブラリを他のプロジェクトに配置すると、Androidのため、リンク時に未定義の記号の問題が発生します.mkdでは隠し記号が定義されており,コンパイル命令は以下のようになる.
# Custom Flags:
# -fvisibility=hidden : don't export all symbols
#LOCAL_CFLAGS += -fvisibility=hidden -I ../../../include -fdata-sections -ffunction-sections

SoundTouchのiOS、Androidでの使用に問題がある


1、NDKリンク時に動的ライブラリ記号が非表示になってAndroidを隠す.mk関連命令でいいです.
2、PCMストレージフォーマットおよび平面オーディオのデフォルトの場合、SoundTouchヘッダファイルはPCMを単精度浮動小数点数(float)と定義する.一方、通常AndroidでPCMを再生するのは16ビット整形であり、これまで参考にした資料によると、float形式でPCMを処理しないのは、浮動小数点数計算がarmeabi-v 7 a以前はソフト実装であり、性能が悪いためである.FFmpegに合わせて使用する場合、例えばmp 3を復号してs 16 pを得る場合、左右の平面(左右のチャネル)を1つの平面、例えばLR LRに混合してSoundTouch処理に渡す必要がある.

学習資料


WELENはオーディオ信号処理のブログをたくさん書いているので、参考にして読むことができます.