从视频中提取音频的 Bash 脚本

从视频中提取音频的 Bash 脚本

我编写了这个小脚本,使用 avconv 从视频中批量提取音频。它运行良好,但奇怪的是它不再工作了(因为我已将编解码器从 aac 更改为 mp3)。

该脚本应该测试文件夹中的每个文件。如果是视频,它应该从中提取音频。

有人能帮我解决这个问题吗?

#!/bin/sh
#
# Batch conversion of audio extraction from video
# doesnt work with mkv files (file -i *.mkv returns application/octet)

FOLDER_SRC="/home/J/Music/TestBatchConv"

for myvid in $(find ${FOLDER_SRC})
do
    if file -i $myvid | grep -q video ;
        then avconv -i $myvid -acodec libmp3lame "${myvid}.mp3"
    fi
done

exit 0

答案1

似乎你正在使用旧版本的filewhere无法正确检测 MKV 文件。 您可以使用这个~/.magic文件识别fileMKV。

但实际上,检查视频文件是否有效的最可靠方法是直接运行avconv,看看是否失败。您可以执行以下操作:

#!/bin/bash
FOLDER_SRC="/home/J/Music/TestBatchConv"
find "$FOLDER_SRC" -type f -print0 | while IFS= read -r -d '' myvid; do
  echo "Trying to convert $myvid"
  avconv -i "$myvid" -c:a libmp3lame -q:a 4 "${myvid%.*}.mp3" 2>/dev/null || echo "$myvid is not a valid file."
done

如果该文件不是有效的视频,或者有任何错误,avconv则将退出。

一些提示和说明:

  • 无需解析ls或的输出find。只需执行for myvid in "$FOLDER_SRC"/*,或者对于递归版本,使用**带有globstar选项的 glob。此处,该find … | while …行可以替换为:

    shopt -s globstar
    for myvid in "$FOLDER_SRC/**"; do
    
  • 不要忘记"$myvid"在循环中正确引用它,否则名称中带有空格的视频会破坏您的脚本。

  • 您可以删除原始文件扩展名,方法是删除最后一个点后的任何内容${myvid%.*}并将其替换为.mp3
  • 你应该告诉avconv使用可变比特率编码例如libmp3lame,值为-q:a 4,范围为 0–10,默认值为 4。这通常会为您提供更好的音频质量。

答案2

对于那些感兴趣的人,这里是最终的工作代码:

#!/bin/bash
#
# Batch conversion of audio extraction from video

echo $BASH_VERSION
FOLDER_SRC="/home/J/Music/TestBatchConv"

shopt -s globstar

for myvid in "$FOLDER_SRC"/**
do
  echo "$myvid"
  avconv -i "$myvid" -acodec libmp3lame "${myvid%.*}.mp3" 2>/dev/null || echo "$myvid is not a valid file."
done
exit 0

相关内容