使用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