どのようにしてffmpegでディレクトリ全体を変換しますか?


191

コマンドライン経由のffmpegまたはバッチスクリプトを使用して、ディレクトリ/フォルダー全体をどのように変換しますか?

回答:


175

以前の回答では、out.movという名前の出力ファイルが1つだけ作成されます。古い映画ごとに個別の出力ファイルを作成するには、これを試してください。

for i in *.avi;
  do name=`echo "$i" | cut -d'.' -f1`
  echo "$name"
  ffmpeg -i "$i" "${name}.mov"
done

24
私のようで、ファイル名に多数のスペース(およびその他の問題のある文字)が含まれている場合は、二重引用符を追加することをお勧めします。ffmpeg -i "$ i" "$ name.mov";
Pif

7
エラーが発生しますi was unexpected at this time.
Keavon、2014年

5
do name=`echo "${i%.*}"`;ドット(およびスペース)を含むファイル名を処理します。
Nepoxx 2015年

8
うわー、この答えは信じられないほど複雑です。1行の回答の1つを参照してください。
foob​​arbecue

2
これ.batはWindowsでのサポートですか?
Jazuly

294

以下のためのLinuxMacOSのこれは使用して、1行で行うことができるパラメータ展開を、出力ファイルのファイル名の拡張子を変更するには:

for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done

2
これは完璧です、ありがとう!完全に機能する完全なコマンドを次に示します。do ffmpeg -i "$ i" -c:a aac -b:a 128k -c:v libx264 -crf 20 "$ {i%.avi} .mp4"; 完了
Phil Kulak 2017

1
@Junaid 1)出力ファイルには入力とは異なる名前を使用するか、別のディレクトリffmpegへの出力を使用してください。同じファイルへの入力と出力はできないためです。2)BashコマンドがWindows 10でネイティブに機能するかどうかはわかりません。LinuxやmacOSなど、ネイティブでBashを使用できるシステムをターゲットにしているという回答を追加する必要があるかもしれません。lxsは、この質問に対するWindowsの回答を提供しました。
llogan

4
素晴らしい答え。スペースを含むファイル名でも機能します!
wisbucky

1
これが一番の答えになるはずです。確かに、{$ i%。*}の理由は単純ではありませんが、それを脇に置いて「そのまま使用」することができれば、それに合わせてすばやく変更できます。たとえば、私は何百もの.mp4(ファイル名にスペースと特殊文字を含む)を以下を使用してより小さなフォーマットに変換しました。for i .mp4; do ffmpeg -i "$ i" -s 512x288 -c:a copy "$ {i%。 } .m4v"; 完了
トニーM

1
さらに一歩進んで、H.265からH.26​​4にトランスコーディングする場合に文字列「x265」を「x264」に置き換える場合は、Bashパラメータ置換を使用できます。これは一般的な使用例です。 for f in *.mkv; do ffmpeg -i "$f" -map 0 -movflags faststart -c:v libx264 -c:a copy -c:s copy "${f/x265/x264}"; done
Travis Runyard

70

そしてWindowsでは:

FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec mp3 "%~nG.mp3"

19
このコマンドをバッチ(.bat)ファイルで実行する場合、%記号を2倍にする必要があります=> %%
hB0

このコマンドを実行して、元のファイルのメタデータを含む新しいファイルにコピーする方法はありますか?
Barryman9000 2016

@ Barryman9000これはずっと前のことですが、渡すことができる出力ファイルオプションがあると思います
lxs

@lxsフォローアップありがとうございます。私は、元のファイルの日付、作成する新しいファイルの名前を変更することにより、PowerShellを使用し、それをやってしまったstackoverflow.com/a/35671099/197472
Barryman9000

メタデータの削除に使用しました。しかし、それは私にアクセス拒否エラーを与えています。そこで、新しいファイルにするために、出力ファイル名を余分なスペースで変更しました。FOR /F "tokens=*" %G IN ('dir /b *.mp3') DO ffmpeg -i "%G" -map_metadata -1 -c:v copy -c:a copy "%~nG .mp3"
Junaid

28

1行のbashスクリプトは簡単に実行でき*.aviます。ファイルタイプに置き換えてください。

for i in *.avi; do ffmpeg -i "$i" -qscale 0 "$(basename "$i" .avi)".mov  ; done

.movのデフォルトのエンコーダーはlibx264(使用可能な場合)ですが、このエンコーダーはを無視し-qscaleます。それを削除してデフォルト設定を使用するか、-crf代わりに使用します(デフォルトはです-crf 23)。
llogan

1
ファイル名にスペースが含まれている場合、バッククォートされたbasenameサブシェルが引用されていないため、コマンドは失敗します。これが、bashが代わりにシェル拡張を使用する理由です:for i in * .avi; do ffmpeg -i "$ i" -qscale 0 "$(basename" $ i ".avi)"。mov; 完了
Calimo

おかげで@Calimo完全に同意する-私は私の答えを更新しました
卵黄

22

サブディレクトリで変換するには、例えば

find . -exec ffmpeg -i {} {}.mp3 \;

これをこの回答と組み合わせて使用​​して、VTTをSRTに変換し、大きな効果を得ました。find -name "*.vtt" -exec ffmpeg -i {} {}.srt \;
GroovePlex

すべてのmp4をmp3に変換するわずかな変更を加えたこのコマンド:find *.mp4 -exec ffmpeg -i {} {}.mp3 \;
swdev

1
または、複数のファイルタイプを変換する場合:find . -name *.ogg -or -name *.wma -exec ffmpeg -i {} {}.mp3 \;
bonh

すべてのwmaファイルをmp3に変換して削除した後:find . -name *.wma -exec ffmpeg -i {} {}.mp3 \; -exec rm {} \;
Panagiotis

20

Windowsの場合:

ここでは、すべての(.mp4)ファイルを(.mp3)ファイルに変換しています。
cmdを開き、目的のフォルダーに移動してコマンドを入力します。

ショートカット:(オプション)
1.(.mp4)ファイルが存在するフォルダーに移動します
2. Shiftキーを押しながら左クリックして、[ここにPowerShellウィンドウを開く]
または[ここにコマンドプロンプトウィンドウを開く]を選択します
3.「cmd」と入力します[注:PowerShellではなくcmdを直接開く場合は、この手順をスキップしてください]
4.コマンドを実行します

for %i in (*.mp4) do ffmpeg -i "%i" "%~ni.mp3"

Windows 10でこれをバッチファイルに入れる場合は、%% iを使用する必要があります。


18

ffmpegで何かをバッチ変換したいが便利なWindowsインターフェースが欲しい人のために、私はこのフロントエンドを開発しました:

https://sourceforge.net/projects/ffmpeg-batch

それはffmpegにウィンドウファッションインターフェイス、進行状況バー、残り時間情報、ffmpegを使用するときにいつも見逃していた機能を追加します。


わかりました、これは素晴らしいプロジェクトです!私はffmpegにWindowsでの相対出力ファイルパスを受け入れさせるために1時間尾を追っています。これにより、不正行為のように感じられます。編集:私はこれを使用して.xwmを.flacに変換します
semtex41

6

GNU パラレルvid_dir使用している場合、以下のすべての.aviファイルを並行してmp4に変換できます。

find vid_dir -type f -name '*.avi' -not -empty -print0 |
    parallel -0 -j -1 ffmpeg -loglevel fatal -i {} {.}.mp4

異なる形式間で変換するには、必要に応じて、'*.avi'または.mp4を変更します。GNU parallelは、通常と呼ばれるパッケージのほとんどのLinuxディストリビューションのリポジトリにリストされていますparallel


!bashのワンライナーの最後に追加することで同じことができませんか?
stib

3

これは冗長になる可能性があることはわかっていますが、このスクリプトを使用してファイルをバッチ変換します。

old_extension=$1
new_extension=$2

for i in *."$old_extension";
  do ffmpeg -i "$i" "${i%.*}.$new_extension";
done

より柔軟にするために2つの引数を取ります。

  1. 変換元の拡張子
  2. 変換したい新しい拡張子

エイリアスを作成しますが、次のように手動で使用することもできます。

sh batch_convert.sh mkv mp4

これにより、すべてのmkvファイルがmp4ファイルに変換されます。

ご覧のとおり、少し多用途です。ffmpeg変換できる限り、2つの拡張子を指定できます。


それは最高です👍–
Andreas Prang

3

ここではコードゴルフのようになっていますが、これまでのほとんどすべての答えはbash(1つだけのcmdを除く)なので、ここにウィンドウがあります ため、Powershellを使用クロスプラットフォームコマンドを次に示します(すごいため):

ls *.avi|%{ ffmpeg -i $_ <ffmpeg options here> $_.name.replace($_.extension, ".mp4")}

* .aviをソースフッテージと一致するものに変更できます。


3

もちろん、PowerShellが登場しました。これは、まさにこのようなものを非常に作成するように特別に設計されています簡単。

そして、はい、PowerShell も利用可能です Windows以外のオペレーティングシステムでますが、Windowsにプレインストールされているので、これは誰にとっても役立つはずです。

最初に、現在のディレクトリ内のすべてのファイルを一覧表示する必要があるため、最初に次のようにします。

ls

あなたも使うことができます ls -Recurseサブディレクトリ内のすべてのファイルを再帰的に変換場合にできます。

次に、それらを、変換するファイルの種類( "avi"など)のみにフィルタリングします。

ls | Where { $_.Extension -eq ".avi" }

その後、その情報をFFmpegに渡します。 ForEach

FFmpegの入力にはFullName、ファイルへの完全なパスである-を使用します。そして、FFmpegのの出力のために、我々は、使用しますName-しかし、交換.aviして終わり.mp3。したがって、次のようになります。

$_.Name.Replace(".avi", ".mp3")

それで、それらすべてをまとめてみましょう、これが結果です:

ls | Where { $_.Extension -eq ".avi" } | ForEach { ffmpeg -i $_.FullName $_.Name.Replace(".avi", ".mp3") }

これにより、すべての「.avi」ファイルがFFmpegを介して「.mp3」ファイルに変換されます。引用符で囲まれた3つを置き換えるだけで、変換の種類を決定できます。また、他の引数をFFmpegに追加して、 ForEach

これをさらに一歩進めて追加することができます Remove-Item、最後にして古いファイルを自動的に削除することができます。

場合はffmpeg、あなたのパスにない、そしてそれは、あなたが現在いるディレクトリに実際に書き込みをだ./ffmpegばかりするのではなく、そこにffmpeg

これが誰にも役立つことを願っています。


1
PowerShellはすばらしいです。ありがとうございます。他の誰かがこれを実行して問題が発生した場合:このコマンドを.ps1ファイルではなくファイルに入れ.batます。あなたは実行する必要がありますSet-ExecutionPolicy RemoteSignedあなたが前にPSスクリプトを実行したことがない場合は、管理者として。
starpause

まあ、一般的にはPowerShellで直接実行することを考えただけなので、実際には考えていませんでした。でも良いヒントです!
ABPerson

2
for i in *.flac;
  do name=`echo "${i%.*}"`;
  echo $name;
  ffmpeg -i "${i}" -ab 320k -map_metadata 0 -id3v2_version 3 "${name}".mp3;
done

[1] [2]を使用してflacファイルをバッチ処理mp3(スペースを含むファイル名に対して安全)


2

ウィンドウズ:

@echo off
for /r %%d in (*.wav) do (
    ffmpeg -i "%%~nd%%~xd" -codec:a libmp3lame -c:v copy -qscale:a 2 "%

%~nd.2.mp3"
)

これは品質2の可変ビットレートです。必要に応じて0に設定できますが、本当に優れたスピーカーシステムがない限り、価値はありません。


1

ffmpegXでバッチ処理するグラフィカルインターフェイスが必要場合はQuick Batcherを試してください。これは無料で、最後のffmpegX設定を使用して、そこにドロップしたファイルを変換します。

フォルダーをクイックバッチャーにドラッグドロップできないことに注意してください。したがって、ファイルを選択してから、それらをクイックバッチャーに入れます。


2
「Quick Batcher」ソフトウェアはMAC OS専用です
Mohammad ElNesr 2017年

1

これだけが私のために働いた、plsはffmpeg.exeファイルが置かれている場所に「newfiles」フォルダーを手動で作成する必要があることに気づく。

変換します。.wavオーディオコードへのファイル:

for %%a in ("*.*") do ffmpeg.exe -i "%%a" "newfiles\%%~na.wav"
pause

つまり、すべての.mp3ファイルを.wavに変換する場合は、に変更("*.*")("*.mp3")ます。

このスクリプトの作成者は次のとおりです。

https://forum.videohelp.com/threads/356314-How-to-batch-convert-multiplex-any-files-with-ffmpeg

お役に立てば幸いです。


0

これにより、現在のディレクトリのすべてのjpgファイルからmp4ビデオが作成されます。

echo exec("ffmpeg -framerate 1/5 -i photo%d.jpg -r 25 -pix_fmt yuv420p output.mp4");

0

そしてWindowsの場合、これは機能しません

FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec mp3 "%~nG.mp3"

倍増しても%

私も提案します:

-acodec ***libmp3lame***

また:

FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec libmp3lame "%~nG.mp3"

これは答えですか、それとも新しい質問を答​​えとして投稿しようとしていますか?後者の場合は、代わりに完全に新しい質問を作成してください。ただし、ここにバックグラウンドでリンクしている可能性があります。
トリプルリー

0

これは私がaviを1280x mp4にバッチ変換するのに使用するものです

FOR /F "tokens=*" %%G IN ('dir /b *.avi') DO "D:\Downloads\ffmpeg.exe" -hide_banner -i "%%G" -threads 8 -acodec mp3 -b:a 128k -ac 2 -strict -2 -c:v libx264 -crf 23 -filter:v "scale=1280:-2,unsharp=5:5:1.0:5:5:0.0" -sws_flags lanczos -b:v 1024k -profile:v main -preset medium -tune film -async 1 -vsync 1 "%%~nG.mp4"

cmdファイルとしてうまく機能し、実行すると、ループはそのフォルダー内のすべてのaviファイルを見つけます。

MY(あなたのために変更)ffmpegを呼び出し、入力名を渡します。設定は、シャープ化を使用して再スケーリングするためのものです。CRFと " -b:v 1024k" は必要ありません。

出力ファイルは、拡張子を除いた入力ファイルで、新しい拡張子はmp4です。


0

Linuxでこのワンライナーを使用して、ファイル(通常はH265)を、Kodiで問題なく再生できるものに変換します。

for f in *.mkv; do ffmpeg -i "$f" -c:v libx264 -crf 28 -c:a aac -b:a 128k output.mkv; mv -f output.mkv "$f"; done

これにより一時ファイルに変換され、元のファイルが置き換えられるため、変換後も名前は変わりません。


0

また、サブフォルダーで同じ変換が必要な場合。これが再帰的なコードです。

for /R "folder_path" %%f in (*.mov,*.mxf,*.mkv,*.webm) do (
    ffmpeg.exe -i "%%~f" "%%~f.mp4"
    )

-1

それを行う小さなphpスクリプト:

#!/usr/bin/env php
<?php
declare(strict_types = 1);
if ($argc !== 2) {
    fprintf ( STDERR, "usage: %s dir\n", $argv [0] );
    die ( 1 );
}
$dir = rtrim ( $argv [1], DIRECTORY_SEPARATOR );
if (! is_readable ( $dir )) {
    fprintf ( STDERR, "supplied path is not readable! (try running as an administrator?)" );
    die(1);
}
if (! is_dir ( $dir )) {
    fprintf ( STDERR, "supplied path is not a directory!" );
    die(1);
}
$files = glob ( $dir . DIRECTORY_SEPARATOR . '*.avi' );
foreach ( $files as $file ) {
    system ( "ffmpeg -i " . escapeshellarg ( $file ) . ' ' . escapeshellarg ( $file . '.mp4' ) );
}

2
ユーザーが自分のマシンにPHPをインストールする必要があるため、範囲が非常に限定された答え。コマンドラインとバッチファイルの応答は、はるかに簡単で、はるかに簡単です。
ProfK 2017年

2
@ProfK PHPは、SOで最も人気のある言語の1つです。2 番目に、shに対するIsaacの答えは、ファイル名を元の名前に変更する可能性があるなど、ある程度信頼できません。たとえば、ファイル名の改行が保持されません。lyxのbatスクリプトはさらに悪いことに、名前に改行が含まれるファイルを完全に無視します。理由はわかりませんが、構文エラーなどはありませんが、それはあります(win10でテスト済み)。私のphpスクリプトはのおかげで問題もありませんescapeshellarg()。また、WindowsとLinuxの両方で動作します。私はそれでもエッジケースに同意します。
hanshenrik 2017年

-1

まだ提案されていない別の簡単な解決策は、使用することxargsです:

ls *.avi | xargs -i -n1 ffmpeg -i {} "{}.mp4"

小さな落とし穴の1つは、出力ファイル(たとえばinput.avi.mp4)の扱いにくい名前です。これに対する可能な回避策は次のとおりです。

ls *.avi | xargs -i -n1 bash -c "i={}; ffmpeg -i {} "\${i%.*}.mp4"


shellcheck.netには、例に関するいくつかの提案があります。
llogan 2018年

mywiki.wooledge.org/ParsingLsただしlsprintf '%s\n'ここで簡単に置き換えることができます。
Tripleee
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.