回答:
以前の回答では、out.movという名前の出力ファイルが1つだけ作成されます。古い映画ごとに個別の出力ファイルを作成するには、これを試してください。
for i in *.avi;
do name=`echo "$i" | cut -d'.' -f1`
echo "$name"
ffmpeg -i "$i" "${name}.mov"
done
i was unexpected at this time.
do name=`echo "${i%.*}"`;
ドット(およびスペース)を含むファイル名を処理します。
.bat
はWindowsでのサポートですか?
以下のためのLinuxとMacOSのこれは使用して、1行で行うことができるパラメータ展開を、出力ファイルのファイル名の拡張子を変更するには:
for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done
ffmpeg
への出力を使用してください。同じファイルへの入力と出力はできないためです。2)BashコマンドがWindows 10でネイティブに機能するかどうかはわかりません。LinuxやmacOSなど、ネイティブでBashを使用できるシステムをターゲットにしているという回答を追加する必要があるかもしれません。lxsは、この質問に対するWindowsの回答を提供しました。
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
そしてWindowsでは:
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec mp3 "%~nG.mp3"
FOR /F "tokens=*" %G IN ('dir /b *.mp3') DO ffmpeg -i "%G" -map_metadata -1 -c:v copy -c:a copy "%~nG .mp3"
1行のbashスクリプトは簡単に実行でき*.avi
ます。ファイルタイプに置き換えてください。
for i in *.avi; do ffmpeg -i "$i" -qscale 0 "$(basename "$i" .avi)".mov ; done
-qscale
ます。それを削除してデフォルト設定を使用するか、-crf
代わりに使用します(デフォルトはです-crf 23
)。
basename
サブシェルが引用されていないため、コマンドは失敗します。これが、bashが代わりにシェル拡張を使用する理由です:for i in * .avi; do ffmpeg -i "$ i" -qscale 0 "$(basename" $ i ".avi)"。mov; 完了
サブディレクトリで変換するには、例えば
find . -exec ffmpeg -i {} {}.mp3 \;
find -name "*.vtt" -exec ffmpeg -i {} {}.srt \;
find *.mp4 -exec ffmpeg -i {} {}.mp3 \;
find . -name *.ogg -or -name *.wma -exec ffmpeg -i {} {}.mp3 \;
find . -name *.wma -exec ffmpeg -i {} {}.mp3 \; -exec rm {} \;
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を使用する必要があります。
ffmpegで何かをバッチ変換したいが便利なWindowsインターフェースが欲しい人のために、私はこのフロントエンドを開発しました:
https://sourceforge.net/projects/ffmpeg-batch
それはffmpegにウィンドウファッションインターフェイス、進行状況バー、残り時間情報、ffmpegを使用するときにいつも見逃していた機能を追加します。
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のワンライナーの最後に追加することで同じことができませんか?
これは冗長になる可能性があることはわかっていますが、このスクリプトを使用してファイルをバッチ変換します。
old_extension=$1
new_extension=$2
for i in *."$old_extension";
do ffmpeg -i "$i" "${i%.*}.$new_extension";
done
より柔軟にするために2つの引数を取ります。
エイリアスを作成しますが、次のように手動で使用することもできます。
sh batch_convert.sh mkv mp4
これにより、すべてのmkv
ファイルがmp4
ファイルに変換されます。
ご覧のとおり、少し多用途です。ffmpeg
変換できる限り、2つの拡張子を指定できます。
ここではコードゴルフのようになっていますが、これまでのほとんどすべての答えはbash(1つだけのcmdを除く)なので、ここにウィンドウがあります ため、Powershellを使用クロスプラットフォームコマンドを次に示します(すごいため):
ls *.avi|%{ ffmpeg -i $_ <ffmpeg options here> $_.name.replace($_.extension, ".mp4")}
* .aviをソースフッテージと一致するものに変更できます。
もちろん、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
。
これが誰にも役立つことを願っています。
.ps1
ファイルではなくファイルに入れ.bat
ます。あなたは実行する必要がありますSet-ExecutionPolicy RemoteSigned
あなたが前にPSスクリプトを実行したことがない場合は、管理者として。
for i in *.flac;
do name=`echo "${i%.*}"`;
echo $name;
ffmpeg -i "${i}" -ab 320k -map_metadata 0 -id3v2_version 3 "${name}".mp3;
done
ウィンドウズ:
@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に設定できますが、本当に優れたスピーカーシステムがない限り、価値はありません。
ffmpegXでバッチ処理するグラフィカルインターフェイスが必要な場合は、Quick Batcherを試してください。これは無料で、最後のffmpegX設定を使用して、そこにドロップしたファイルを変換します。
フォルダーをクイックバッチャーにドラッグドロップできないことに注意してください。したがって、ファイルを選択してから、それらをクイックバッチャーに入れます。
これだけが私のために働いた、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
お役に立てば幸いです。
これにより、現在のディレクトリのすべてのjpgファイルからmp4ビデオが作成されます。
echo exec("ffmpeg -framerate 1/5 -i photo%d.jpg -r 25 -pix_fmt yuv420p output.mp4");
そして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"
これは私が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です。
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
これにより一時ファイルに変換され、元のファイルが置き換えられるため、変換後も名前は変わりません。
それを行う小さな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' ) );
}
escapeshellarg()
。また、WindowsとLinuxの両方で動作します。私はそれでもエッジケースに同意します。
まだ提案されていない別の簡単な解決策は、使用すること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"
」