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

2 ответа

Решение

Кажется, вы используете старую версию file где MKV файлы не были обнаружены должным образом. Вы можете использовать это ~/.magic файл, чтобы иметь file идентифицировать MKV.

Но на самом деле самый надежный способ проверить правильность видеофайлов - просто запустить 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 вариант. Здесь find … | while … Линия может быть заменена на:

    shopt -s globstar
    for myvid in "$FOLDER_SRC/**"; do
    
  • Не забудьте правильно процитировать "$myvid" где бы вы ни использовали его в цикле, иначе видео с пробелами в названии нарушают ваш сценарий.

  • Вы можете удалить исходное расширение файла, удалив что-нибудь после последней точки ${myvid%.*} и заменить его на .mp3,
  • Ты должен сказать avconv использовать переменную кодировку битрейта для libmp3lame например, с -q:a 4 со значениями в диапазоне от 0 до 10 и 4 по умолчанию. Это даст вам лучшее качество звука в целом.

Для интересующихся вот последний рабочий код:

#!/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
Другие вопросы по тегам