web-dev-qa-db-ja.com

FFMPEG:複数のコアを使用したm4aからmp3への変換

次のコマンドを使用して、m4a形式をmp3に変換します

ffmpeg -i audio.m4a -acodec libmp3lame audio.mp3

私は32個のx86コアを持っていますが、libmp3lameは単一のスレッドで処理します。 libmp3lameがマルチスレッドをサポートしていないことを知っているので、ubuntuCLIで実行できる他の代替手段を利用できます。

Audio.m4aが2時間の長さのビデオの場合、通常は3分以上かかり、速度は45倍から50倍のように見えます。

私の主な目標は、数秒以内に複数のYouTubeビデオをmp3形式に変換することです。

アップデート1:

私は32コアのCPUを使用しているので、ビデオ変換が1つしかない場合は、1つのコアだけを使用します。したがって、その場合、出力をより速く取得するために、複数のコアを使用する方法。 CPUから最大を達成したい。また、FFmpegが答えではない場合、他の方法はありますか?.

3
Johny Pie

GNU Parallel あなたが探しているものとまったく同じように聞こえます。

これは、オリジナルを使用してGNU Parallelを使用する方法の例です(videosという名前のすべての*.m4aファイルを含むディレクトリがすでにあると仮定します)コマンド:

find /path/to/videos -name "*.m4a" | parallel 'ffmpeg -i {} -acodec libmp3lame {.}.mp3'

説明する2つのこと:

1findコマンドの出力(つまり、変換する.m4aファイルのリスト)は、パイプで送られます。 parallelコマンド。これにより、(デフォルトで)コアの数だけジョブが実行されます。本質的には、findコマンドからの出力を分割し、それをさまざまなジョブに分散して作業します。

2GNU Parallel Tutorial によると、{}は引数の行き先であり、{.}引数を代入して端末拡張子(この場合は.m4a)を削除すると、出力は元のファイル名になりますが、拡張子は.mp3になります。

[〜#〜] note [〜#〜]:この例では、変換されたすべてのファイルを元のファイルがある場所に書き込みます。これが問題である場合は、変換されたファイルをffmpegコマンドを含む引数文字列に格納するディレクトリを渡すだけです。

find /path/to/videos -name "*.m4a" | parallel 'ffmpeg -i {} -acodec libmp3lame /path/to/converted/vids/{.}.mp3'
3
Maverick

インターネット上には、lamemp3エンコーダーのマルチスレッド実装があります。ここで追跡できます

https://github.com/dheller1/lame_pthreads

大きなストレージスペースがある場合は、ffmpegを使用してすべてのm4aファイルをwavファイルに変換し、lame_pthreadsをそのフォルダーにポイントすることができます。

2
Karthik M

エンコーダーはシングルスレッドのみであるため、マルチコアシステムでエンコードを最も効率的にするためにできることは、複数のプロセスを並行して起動することだけです。

たとえば、シェルを使用している場合:

ffmpeg -i input1.mp4 -c:a libmp3lame output1.mp3 &
ffmpeg -i input2.mp4 -c:a libmp3lame output2.mp3 &
…

&コマンドを配置します バックグラウンドに 。コマンドは並行して実行され、負荷はCPUコア間で分散される必要があります。

2
slhck