给定一个带有 WMA2 音频和 MP4 视频的 AVI 封装视频,我如何传递视频、将音频转换为 MP3;然后将整个文件重新封装为 AVI?
ffmpeg -i "foo bar.avi" -acodec libmp3lame "Converted\foo bar.avi"
现在我如何对该.avi
目录下的每个文件执行相同的命令?
(需要使用 bash 或 Windows CLI 的解决方案 [ for
?])
答案1
这难道不简单吗?
for file in *.avi;do ffmpeg -i "$file" -acodec libmp3lame "Converted\\$file";done
编辑:
似乎存在反斜杠问题......
尝试这个:
for file in *.avi;do ffmpeg -i "$file" -acodec libmp3lame 'Converted\\'"$file";done
或这个:
for file in *.avi;do ffmpeg -i "$file" -acodec libmp3lame 'Converted\'"$file";done
答案2
bash
如果您在包含文件的目录中运行它,则以下内容将执行您想要的操作.avi
:
#!/bin/bash
for file in *.avi; do
ffmpeg -i "$file" -c:a libmp3lame "Converted\\$file";
done;
答案3
Python 解决方案
from sh import ffmpeg
from os import listdir
from os.path import split
from sys import argv
[ffmpeg("-i '{0}' -acodec libmp3lame 'Converted\{0}'".format(_file))
for _file in sum([listdir(split(arg)[0]) for arg in argv], [])]
答案4
在对所涉及的命令进行反复试验后,我发现这在 bash shell 中有效
for i in *.ts; do ffmpeg -i "$i" -threads 6 -f mpegts -vcodec libx264 -preset slow -bufsize 8000 -async 48000 -acodec ac3 -ab 384k -n subdir/"${i%}"; done
这将生成一个高质量压缩版本的输入 .ts 文件,其名称相同,但位于子目录中。我猜如果不存在子目录,它就不会写入子目录,因此您必须指定一个子目录来替代我所说的“子目录”。此外,在我发现此批处理的正确语法之前,我使用了 -n 来防止它覆盖我单独渲染的文件。(我有一个 6 核处理器,因此“-threads”也应该根据您的硬件进行调整)