使用avconv批量提取音频而不进行转码
我有大约70 mp4文件,我想直接提取音频文件而不进一步转码。 所有mp4文件都有aac音频文件。
我知道我可以使用以下命令从其中一个mp4文件中提取音频文件:
avconv -i "INPUT FILE" -map 0:1 -c:a copy "OUTPUT FILE"
如何从所有70 mp4文件中提取所有音频文件,所以我最终得到70个aac文件?
您可以使用简单的for循环:
for i in *.mp4; do avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac" done
或在一条线上:
for i in *.mp4; do avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"; done
对于名为*.mp4
每个文件运行avconv
一次,其中文件名存储在${i}
变量中。
${i%.mp4}
表示${i}
(即文件名) .mp4
从末尾剥离。
如果您将所有文件放在一个目录中,那么Xiao的答案通常是最有用的。 但如果有分散在不同目录中的MP4文件,您可以使用此find
命令将它们全部转换。
find . -type f -name '*.mp4' -exec bash -c 'avconv -i "$0" -c:a copy "${0/%mp4/m4a}"' {} \;
这在末尾使用稍微不同forms的bash字符串替换:“$ {0 /%mp4 / m4a}”告诉bash用m4a替换mp4,但前提是mp4位于字符串的末尾。
要避免同时处理多个文件(可能使用太多资源),请使用parallel
。 默认情况下,它一次只能完成一个作业。 如果要并行使用多个CPU内核,请并行尝试parallel -j 4 ...
进行4个作业。 同时检查man parallel
。
sudo apt-get install parallel
此行将从所选video中提取aac
音频文件并将其放入m4a
容器中。
parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F
在CLI中直接工作时,将%F
替换为输入文件列表。 例如*.mp4
。
灵感来自这个答案,通过之前对这个问题的回答,以及evilsoup对后者的评论(说: ‘原始aac文件不能包含元数据;如果你想保留原始文件中的元数据,那么使用m4a(其中)只是mp4的另一个名称,但被音频播放器广泛认可)而不是aac作为文件扩展名’ )。
我在Thunar自定义操作中使用这些命令,
将应用程序限制为包含aac
音频的video。
要在处理期间打开终端窗口(最后关闭),可以更改命令,如:
gnome-terminal -e "parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F"
我扩展了@ Xiao-Long Chen的答案,把它变成了一个脚本,当输出文件更新时跳过文件:
#!/bin/bash for file in *.mp4; do OUT="${file/.mp4/.m4a}" if [ "$file" == "$OUT" ]; then echo "Unable to handle $file" >&2 exit 1 fi if [ "$OUT" -nt "$file" ]; then echo "Skipping $file; output file is newer." continue fi echo "Converting \"$file\" -> \"$OUT\"" avconv -loglevel warning -i "$file" -map 0:1 -c:a copy "$OUT" done