你如何转换整个目录与ffmpeg?

如何通过命令行或批处理脚本使用ffmpeg转换整个目录/文件夹?

以前的答案只会创build一个名为out.mov的输出文件。 为每个老电影制作一个单独的输出文件,试试这个。

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

对于LinuxMacOS,这可以在一行中完成,并且不需要echocutbasename ,如其他Bash答案中所示,因为参数扩展将处理输出文件扩展名:

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

对于Windows来看这个答案 lxs。

在Windows上:

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

一行bash脚本将很容易做 – 用你的文件typesreplace*.avi

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

要转换子目录使用例如

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

如果您想要使用graphics界面批处理ffmpegX,请尝试Quick Batcher 。 它是免费的,并将采取您最后一个ffmpegX设置来转换你放入它的文件。

请注意,您不能将文件夹拖放到Quick Batcher上。 所以select文件,然后通过Quick Batcher。

 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 (安全的文件名与空格)

我把这个PHP一起为我自己的需要。 欢迎您将其修改以适应您自己的需求。

Win10,GeForce GTX 1060,Cygwin,Vixies Cron

/ *你需要一个nVidia 10x系列(或者更好)的GPU用于这个脚本* /

我的媒体目录在顶部的数组中,编码的默认值在最下面。 该脚本采取四个参数之一[电视,新,电影,所有]这与预先configuration的媒体目录或全部相关。 不提供参数将导致脚本recursion地使用当前工作目录。

有一些逻辑来处理电视和电影有点不同的audio.. 384k最大比特率的电视,512k的电影。 如果audiostream匹配或小于这些比特率,则audio编解码器被复制而不是重新编码。 该脚本使用HEVC.H265作为新的NVIDIA nvenc GPU指令。 如果audio被复制(否则为2倍到5倍),我通常可以从4倍(1080)到10倍(720)的任何速度。 最终的结果是BlueRay H.264 12GB降低到H.265 3GB,而且人眼可以感知到的质量完全相同。

比特率是使用video(宽度+高度)*质量来计算的。

例如

(1280 + 720)* 0.842 = 1680k VBR
(1920 + 1080)* 0.842 = 2526k VBR
(3840 + 2160)* 0.842 = 5052k VBR

这是为H.265计算的 – 您可以根据需要自由调整。 质量variables位于脚本底部的编解码器默认function中。 我使用Vixie的Cron在晚上扫描所有媒体目录进行转换。 该脚本使用ffprobe来分析实际媒体stream,以决定是重新编码还是跳过。 它将探测数据存储在./.xml/title.xml中,以便进行快速目录扫描…我已经在低优先级(nice -n15)下运行ffmpeg,以便在别的时候不劫持计算机。

无论如何,这是非常接近我想要的地方,并认为我会分享给大家。 它比Wondershare风格的任何接口(甚至不支持H.265)都要好得多,而且我也不必花钱或时间手动编码。

在tar gzip下载PHP – hevc.tgz

我正在用python编写一个工具来达到相同的目标。 https://github.com/czellerkonti/massento

小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' ) ); }