用引号括起来,以决定所需的转换类型,并且可以在ForEach中向FFmpeg添加任何其他参数

用引号括起来,以决定所需的转换类型,并且可以在ForEach中向FFmpeg添加任何其他参数,ffmpeg,batch-processing,os-agnostic,Ffmpeg,Batch Processing,Os Agnostic,您可以更进一步,在末尾添加Remove Item,以自动删除旧文件 如果ffmpeg不在您的路径中,并且它实际上在您当前所在的目录中,请在那里编写/ffmpeg,而不仅仅是ffmpeg 希望这对任何人都有帮助。我在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

您可以更进一步,在末尾添加
Remove Item
,以自动删除旧文件

如果
ffmpeg
不在您的路径中,并且它实际上在您当前所在的目录中,请在那里编写
/ffmpeg
,而不仅仅是
ffmpeg


希望这对任何人都有帮助。

我在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

这将转换为临时文件,然后替换原始文件,以便在转换后名称保持不变。

如果您希望在子文件夹中进行相同的转换,也可以这样做。 下面是递归代码

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

下面的脚本在Windows上的Bash中运行良好(因此它在Linux和Mac上也应该运行良好)。它解决了我在其他解决方案中遇到的一些问题:

  • 处理子文件夹中的文件
  • 将源扩展替换为目标扩展,而不只是附加它
  • 使用名称中有多个空格和多个点的文件 (有关详细信息,请参阅。)
  • 可以在目标文件存在时运行,在覆盖前提示
ffmpeg批处理转换.sh

sourceExtension=$1#例如“mp3”
targetExtension=$2,例如“wav”
IFS=$'\n';set-f
对于$(find.-iname“*.$sourceExtension”)中的源文件
做
targetFile=“${sourceFile%.*}.$targetExtension”
ffmpeg-i“$sourceFile”“$targetFile”
完成
取消国际单项体育联合会;set+f
示例调用:

$sh ffmpeg-batch-convert.sh mp3 wav

另外,如果您希望删除源文件,可以如下修改脚本:

sh batch_convert.sh mkv mp4
$_.Name.Replace(".avi", ".mp3")
sourceExtension=$1#例如“mp3”
targetExtension=$2,例如“wav”
deleteSourceFile=$3#“删除”或省略
IFS=$'\n';set-f
对于$(find.-iname“*.$sourceExtension”)中的源文件
做
targetFile=“${sourceFile%.*}.$targetExtension”
ffmpeg-i“$sourceFile”“$targetFile”
如果[“$deleteSourceFile”==“delete”];然后
如果[-f“$targetFile”];然后
rm“$sourceFile”
fi
fi
完成
取消国际单项体育联合会;set+f
示例调用:

$sh ffmpeg-batch-convert.sh mp3 wav delete

@Linux 例如,要转换一个束,我的一行是这样的 同一目录中的(.avi到.mkv):

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

请注意output语句中的双精度“%%”。它不仅提供了第一个单词或输入文件名,还提供了最后一个点之前的所有内容。

对于咯咯笑,这里是鱼壳中的解决方案:

for i in *.avi; ffmpeg -i "$i" (string split -r -m1 . $i)[1]".mp4"; end

我需要所有视频使用相同的编解码器进行合并
所以这个转换是mp4到mp4
它在zsh中,但应该可以轻松转换为bash

for S (*.mp4) { ffmpeg -i $S -c:v libx264 -r 30  new$S }

我用它在Windows上为电视节目或电影添加字幕

只需在视频和子目录中创建“subbed”文件夹和bat文件。将代码放入bat文件并运行

for /R  %%f in (*.mov,*.mxf,*.mkv,*.webm) do (
    ffmpeg.exe  -i "%%~f" -i "%%~nf.srt" -map 0:v -map 0:a -map 1:s -metadata:s:a language=eng -metadata:s:s:1 language=tur -c copy ./subbed/"%%~nf.mkv"
    )

如果您和我一样,文件名中有很多空格(和一些其他有问题的字符),我建议添加双引号:ffmpeg-I“$I”“$name.mov”;我得到了一个错误
此时我没有预料到。
do name=`echo“${I%.*}`
将处理带有点(和空格)的文件名。哇,这个答案太复杂了。请参阅一行答案中的一行。这是否支持windows中的
.bat
文件您需要将%signs=>%%加倍您知道如何运行此命令但复制到包含原始文件元数据的新文件吗?@Barryman9000这是很久以前的事了,但我认为您可以使用输出文件选项pass@lxs谢谢你的跟进。最后,我使用Powershell将新文件的名称更改为为为Powershell创建的原始文件的日期:
Get ChildItem*.ogg-recurse |%{ffmpeg.exe-I$\ FullName-map\ u metadata-1-c:v copy-c:a copy(“NewPath”+“\”+$\.name)}
其中
NewPath
=新目录路径。.mov的默认编码器是libx264(如果可用),但此编码器忽略
-qscale
。删除该文件并使用默认设置,或者改用
-crf
(默认值为
-crf 23
)。如果文件名中有空格,则该命令将失败,因为未引用反勾选的
basename
子shell。这正是bash使用shell扩展的原因:对于*.avi中的i;doffmpeg-i“$i”-qscale 0“$(basename“$i.avi)”.mov;donethanks@Calimo完全同意-我已经更新了我的答案这太完美了,谢谢!这里有一个完整的命令,它最终对我非常有效:对于我在*.avi;do ffmpeg-i“$i”-c:aac-b:a 128k-c:v libx264-crf 20“${i%.avi}.mp4”;done@Junaid1)确保输出文件使用与输入文件不同的名称,或输出到另一个目录,因为
ffmpeg
不能输入和输出到同一个文件。2) 我不确定Bash命令是否在windows10本机上工作。也许我应该补充一点,它是针对那些可以在本地使用Bash的系统,比如Linux和macOS。lxs为这个问题提供了一个Windows答案。非常棒的答案。也适用于带空格的文件名!这应该是最好的答案。诚然,对{$i%.*}的解释并不简单,但如果你可以把它放在一边,只是“使用它”,你可以快速修改以适应。例如,我将数百个.mp4(文件名包含空格和特殊字符)转换为更小的格式,使用:For I in.mp4;doffmpeg-i“$i”-s512x288-c:a副本“${i%.}.m4v”;不要再往前走一步,如果要将字符串“x265”替换为“x264”,可以使用从H.265转码到H.264,这是一个常见的用例<代码>用于*.mkv中的f;doffmpeg-i“$f”-map 0-movflags faststart-c:v libx264-c:a copy-c:s copy“${f/x265/x264}”;完成Quick Batcher(快速批处理程序)软件仅适用于MAC OSA,其范围非常有限
sh batch_convert.sh mkv mp4
ls *.avi|%{ ffmpeg -i $_ <ffmpeg options here> $_.name.replace($_.extension, ".mp4")}
@echo off
for /r %%d in (*.wav) do (
    ffmpeg -i "%%~nd%%~xd" -codec:a libmp3lame -c:v copy -qscale:a 2 "%

%~nd.2.mp3"
)
for %i in (*.mp4) do ffmpeg -i "%i" "%~ni.mp3"
for %%a in ("*.*") do ffmpeg.exe -i "%%a" "newfiles\%%~na.wav"
pause
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"
echo exec("ffmpeg -framerate 1/5 -i photo%d.jpg -r 25 -pix_fmt yuv420p output.mp4");
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"
ls
ls | Where { $_.Extension -eq ".avi" }
$_.Name.Replace(".avi", ".mp3")
ls | Where { $_.Extension -eq ".avi" } | ForEach { ffmpeg -i $_.FullName $_.Name.Replace(".avi", ".mp3") }
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
for /R "folder_path" %%f in (*.mov,*.mxf,*.mkv,*.webm) do (
    ffmpeg.exe -i "%%~f" "%%~f.mp4"
    )
for f in *.avi; do ffmpeg -i "${f}" "${f%%.*}.mkv"; done
for i in *.avi; ffmpeg -i "$i" (string split -r -m1 . $i)[1]".mp4"; end
for S (*.mp4) { ffmpeg -i $S -c:v libx264 -r 30  new$S }
for /R  %%f in (*.mov,*.mxf,*.mkv,*.webm) do (
    ffmpeg.exe  -i "%%~f" -i "%%~nf.srt" -map 0:v -map 0:a -map 1:s -metadata:s:a language=eng -metadata:s:s:1 language=tur -c copy ./subbed/"%%~nf.mkv"
    )