古いビデオ(カシオのExilim EX-Z40で作成されたものである場合)があり、そのオーディオストリームffprobe
はpcm_u8, 8000 Hz, mono, u8
として報告されます。
それをモダンなものにトランスコードしたいと思います。
FFmpegデフォルトでのトランスコーディングは失敗します:
libfaacはこの出力形式をサポートしていません!
したがって、-c:a copy
が機能するため、おそらくlibfaacは8 kHzをサポートしていません。
8 kHzサンプリングレートをサポートするエンコーダーはどれですか? ここにあるリスト はサンプリングレートについてほとんど言及していません。
インストールされているすべてのコーデックを試すスクリプトを作成できますか?
ffmpeg -codecs | grep EA`
…どれが機能するかを直接確認するには?
ネイティブFFmpeg AACエンコーダー(-c:a aac
)は、8000 Hzのサンプルレートをサポートします。
ffmpeg -h encoder=aac
...
Supported sample rates: 96000 88200 64000 48000 44100 32000 24000 22050 16000 12000 11025 8000 7350
入力に最も近いサンプルレートが自動的に選択されるため、-ar
を宣言する必要はありません。
ffmpeg -i input.mov -c:a aac output.m4a
FFmpegのどのオーディオエンコーダーが8 kHzをサポートしていますか?
aac、aptx、aptx_hd、dca、flac、g723_1、libfdk_aac、libmp3lame、libopus、libspeex、libvorbis、real_144、wavpack、多くのpcmバリアント。
おそらく他にもありますが、supported_samplerates
の報告には一貫性がありません。
モダンなものにトランスコードしたいのですが。
libfaacは長年FFmpegから削除されており、最新のAACエンコーダーとは見なされていません。あなたのffmpeg
は古いものでなければなりません。ネイティブのFFmpeg AACエンコーダーを更新して使用するか、libfdk_aac
をコンパイルして使用します。
最新のものを使いたい場合はlibopus
を使用してください。
しかし、[aac]を試したところ、元のファイルと比較して、ファイルサイズが大きくなり、一部の高周波が減衰しました。
あなたのffmpeg
は非常に古いと思いますので、エンコーダーaac
の主要な品質更新を見逃している可能性があります。アップグレードと品質はおそらく向上します。
サンプリングレートとコーデックは異なるパラメーターです。ほとんどの場合、あなたはに沿って何かをしたいです
-ar 48000 -c:a aac
8KHzから48KHzにアップサンプリングし、AACに圧縮するには
8 KHzは「ナローバンド」として知られているスピーチのかなり標準的なものです。これがスピーチの場合は、FFmpegがサポートしているわけではありませんが、多くのオプションが必要です。ボックス。おそらく最良のオプションは
ただし、8KHz 8ビットPCMは、そもそも優れたソースではありません。ほとんどのエンコーダーは、より良い入力を期待/期待しています。 8ビットG.711mu-law。8ビット浮動小数点としてエンコードされた実質的に12ビットデータです。純粋な8ビットPCM入力では、モデル化されている音声パターンに適合しない可能性があるため、うまく機能しない可能性があります。
これもかなり小さいファイルであり、ビデオコンテナがより複雑なコーデックをサポートしない可能性があります。だから、これは価値があるよりも厄介だと思うので、オーディオはそのままにしておきます。
Opus は一般に、利用可能な最高の低ビットレートコーデックと見なされ、8-kHzの入力サンプルレートでは 問題はありません です。結果のopusストリームは、デコーダーにとって都合のよいサンプルレートにデコードできます。 (他の不可逆コーデックと同様に、FFTを実行した後、周波数帯域に基づいて圧縮します。しかし、他の一部のコーデックは、入力と同じサンプルレートにのみデコードしたいようです。他の回答が指摘しているように、できますFFmpegを取得して、コーデックに渡す前に入力をリサンプリングしますが、Opusには必要ありません。
24 kbit/s Opusでffmpeg -c:a libopus -b:a 24k -frame_duration 120
を試してください。
おそらく試してみる価値はあります。デフォルトのaudio
プロファイルの代わりに-application voip
を使用して、「音声明瞭度の向上」を調整します。
-frame_duration
を最大値に設定すると、オーバーヘッドが削減されると思います。リアルタイムの双方向ボイスチャットではなく、ファイルだけがあるため、エンコーダー/デコーダーのレイテンシは気になりません。したがって、120ミリ秒のオーディオをバッファリングし、複数のCELTまたはSILKフレームをまとめてフレームヘッダーの冗長性を減らすことができます。
最高の利用可能なOpusエンコーダーは無料でオープンソースのlibopus
( https://opus-codec.org )なので、最高のエンコーダーがあるAACとは異なり、FFmpegはそれを使用できます。クローズドソース。
Opusには、非常に低いビットレートの音声(16kb/sなど)用の特別なモードがあり、音声を検出し、低ビットレートで音声固有のエンコーダー(SILK)に切り替えることさえできます。
Opusの低ビットレートコーディングツールは、HE-AACv2でできることと似ています。 ウィキペディアの記事 を参照してください。
でも試してみると、元に比べてファイルサイズが大きくなり......
非可逆圧縮のポイントの一部は、出力ビットレートを選択できることです 。ほとんどのコーデックは、たとえば-b:a 32k
を使用して、32 kbit/sのオーディオビットレートを選択できます。
(ビデオの場合、-preset veryslowと-preset mediumのように、エンコードに費やされたCPU時間をトレードオフすることもできます。しかし、オーディオの圧縮は十分に安いので、ほとんどのコーデックにはビットレートを改善するためにより多くのCPU時間を費やすオプションがありません。と品質のトレードオフ)
モノ8ビット8 kHz PCMのビットレートは64 kbit/s = 8 * 8000であるため、それより低い値を目指しています。それ以外の場合は、元のファイルを保持することもできます。 PCMは生のサンプルなので、ビットレートはサンプルレートとサンプル幅の積にすぎません。 .bmp
ビットマップ画像に相当するオーディオと同じです。それは非常に非効率的であり、より優れたコーデックが発明された理由です。 (そして、リスニングからわかるように、ビットレートはサンプルレートと1:1で結び付けられているため、PCMのビットレートを保存すると、品質と周波数の範囲に多大なコストがかかります。不可逆コーデックを使用して、周波数領域で量子化します。
そして、いくつかの高周波は減衰されました。したがって、
-c:a copy
よりも悪い
FFmpegのネイティブAACエンコーダー-c:a aac
は以前はかなり悪く、古いFFmpegを使用していました。 https://trac.ffmpeg.org/wiki/Encode/HighQualityAudio によると、2017年の時点で、AAC-LCのaac
はlibfdk_aac
よりも優れていることがあります(低複雑性の高いビットレート)。ただし、HE-AACについては触れられておらず、それが低ビットレートAACに必要なことです。
libfdk_aac
は、利用可能な最高のオープンソースAACエンコーダーであり、HE-AAC用である可能性があります。私の知る限り、どちらも最高の非フリーAACエンコーダーほど優れていません。
低ビットレートのAACの場合、コーディングツールを追加するHE-AACが本当に必要です https://en.wikipedia.org/wiki/High-Efficiency_Advanced_Audio_Coding 。 -c:a aac
がそれを実行できるかどうかはわかりません。
https://trac.ffmpeg.org/wiki/Encode/HighQualityAudio は、いくつかの推奨設定と、さまざまなエンコーダーの有用なビットレートの範囲を示しています。
しかし、おそらくOpus、またはおそらく4 kbit/sのようなビットレートのAMR-NB(狭帯域)が必要です。 Opus wiki記事の品質とビットレートのプロット が何歳かはわかりませんが、AMR-NBがOpusよりも品質が高く、8 kb/s未満になっています。
その数ビットで、音声を理解できるかもしれませんが、音は鳴りませんNice。それは、どのコーデックが最も恐ろしいかという問題にすぎません。