次のコマンドを使用して、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が答えではない場合、他の方法はありますか?.
GNU Parallel あなたが探しているものとまったく同じように聞こえます。
これは、オリジナルを使用してGNU Parallelを使用する方法の例です(videos
という名前のすべての*.m4a
ファイルを含むディレクトリがすでにあると仮定します)コマンド:
find /path/to/videos -name "*.m4a" | parallel 'ffmpeg -i {} -acodec libmp3lame {.}.mp3'
説明する2つのこと:
1:find
コマンドの出力(つまり、変換する.m4a
ファイルのリスト)は、パイプで送られます。 parallel
コマンド。これにより、(デフォルトで)コアの数だけジョブが実行されます。本質的には、find
コマンドからの出力を分割し、それをさまざまなジョブに分散して作業します。
2: GNU Parallel Tutorial によると、{}
は引数の行き先であり、{.}
引数を代入して端末拡張子(この場合は.m4a
)を削除すると、出力は元のファイル名になりますが、拡張子は.mp3
になります。
[〜#〜] note [〜#〜]:この例では、変換されたすべてのファイルを元のファイルがある場所に書き込みます。これが問題である場合は、変換されたファイルをffmpeg
コマンドを含む引数文字列に格納するディレクトリを渡すだけです。
find /path/to/videos -name "*.m4a" | parallel 'ffmpeg -i {} -acodec libmp3lame /path/to/converted/vids/{.}.mp3'
インターネット上には、lamemp3エンコーダーのマルチスレッド実装があります。ここで追跡できます
https://github.com/dheller1/lame_pthreads
大きなストレージスペースがある場合は、ffmpegを使用してすべてのm4aファイルをwavファイルに変換し、lame_pthreadsをそのフォルダーにポイントすることができます。
エンコーダーはシングルスレッドのみであるため、マルチコアシステムでエンコードを最も効率的にするためにできることは、複数のプロセスを並行して起動することだけです。
たとえば、シェルを使用している場合:
ffmpeg -i input1.mp4 -c:a libmp3lame output1.mp3 &
ffmpeg -i input2.mp4 -c:a libmp3lame output2.mp3 &
…
&
コマンドを配置します バックグラウンドに 。コマンドは並行して実行され、負荷はCPUコア間で分散される必要があります。