Answers:
先前的答案只会创建1个名为out.mov的输出文件。要为每个旧电影制作单独的输出文件,请尝试此操作。
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,可以使用参数扩展更改输出文件的文件扩展名,在一行中完成:
for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done
ffmpeg
不能输入和输出到同一文件。2)我不确定Bash命令是否可以在Windows 10本机上运行。也许我应该补充一点,它针对的是可以本地使用Bash的系统,例如Linux和macOS。lxs为该问题提供了Windows答案。
在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"
单行bash脚本很容易做到-替换*.avi
为您的文件类型:
for i in *.avi; do ffmpeg -i "$i" -qscale 0 "$(basename "$i" .avi)".mov ; done
-qscale
。将其删除并使用默认设置,或者改用默认设置-crf
(默认为-crf 23
)。
basename
子shell。这正是bash改用shell扩展的原因:对于* .avi中的i;做ffmpeg -i“ $ i” -qscale 0“ $(基本名” $ i“ .avi)”。mov; 完成
要使用子目录进行转换,请使用例如
find . -exec ffmpeg -i {} {}.mp3 \;
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 {} \;
对于任何想用ffmpeg进行批量转换但又想拥有方便的Windows界面的人,我开发了此前端:
https://sourceforge.net/projects/ffmpeg-batch
它为ffmpeg增添了一个窗口时尚界面,进度条和剩余时间信息,这些是我在使用ffmpeg时经常错过的功能。
如果您使用的是GNU 并行,则可以将以下所有.avi文件并行转换vid_dir
为mp4,使用其中一个CPU内核以外的所有内核
find vid_dir -type f -name '*.avi' -not -empty -print0 |
parallel -0 -j -1 ffmpeg -loglevel fatal -i {} {.}.mp4
要与其他格式进行转换,请更改'*.avi'
或.mp4
根据需要进行更改。在大多数Linux发行版存储库中,GNU parallel在一个通常称为的软件包中列出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
可以转换它,就可以指定任何两个扩展名。
当然,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") }
这将通过FFmpeg将所有“ .avi”文件转换为“ .mp3”文件,只需替换引号中的三项内容即可确定所需的转换类型,并可以在FFmpeg中随意添加任何其他参数ForEach
。
您可以更进一步,最后添加Remove-Item
以自动删除旧文件。
如果ffmpeg
不在您的路径中,并且实际上在您当前所在的目录中,请在该目录中./ffmpeg
而不是ffmpeg
。
希望这对任何人有帮助。
.ps1
文件中,而不是.bat
文件中。Set-ExecutionPolicy RemoteSigned
如果您以前从未运行过PS脚本,则必须以管理员身份运行。
如果您希望图形界面使用ffmpegX进行批处理,请尝试使用Quick Batcher。它是免费的,将使用您最后的ffmpegX设置来转换您放入其中的文件。
请注意,您不能将文件夹拖放到Quick Batcher上。因此,选择文件,然后将其放入快速批处理程序。
仅此一项对我有用,请注意,您必须手动在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
希望对你有帮助。
对于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是新的扩展名。
另外,如果您想在子文件夹中进行相同的转换。这是递归代码。
for /R "folder_path" %%f in (*.mov,*.mxf,*.mkv,*.webm) do (
ffmpeg.exe -i "%%~f" "%%~f.mp4"
)
小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"
一个较小的陷阱是输出文件(例如input.avi.mp4
)的尴尬命名。可能的解决方法是:
ls *.avi | xargs -i -n1 bash -c "i={}; ffmpeg -i {} "\${i%.*}.mp4"
”