Пакетный экстракт аудио с avconv без транскодирования

У меня около 70 файлов mp4, и я хочу напрямую извлечь аудиофайлы без транскодирования. Все файлы mp4 имеют аудиофайлы aac.

Насколько я понимаю, я могу использовать следующую команду для извлечения аудиофайла из одного из файлов mp4:

avconv -i "INPUT FILE" -map 0:1 -c:a copy "OUTPUT FILE"

Как извлечь все аудиофайлы из всех файлов 70 mp4, поэтому я получаю 70 файлов aac?

1
задан 23 January 2015 в 18:26

3 ответа

Ответ Xiao, как правило, наиболее полезен, если у вас есть все файлы в одном каталоге; но если файлы MP4 разбросаны в разных каталогах, вы можете использовать эту команду find для их преобразования.

find . -type f -name '*.mp4' -exec bash -c 'avconv -i "$0" -c:a copy "${0/%mp4/m4a}"' {} \;

В конце используется немного другая форма замены bash string: «$ {0 /% mp4 / m4a} "говорит bash, чтобы заменить mp4 на m4a, но только если mp4 находится в конце строки.

5
ответ дан 25 May 2018 в 02:47
  • 1
    Я никогда не знал, что у этого баха есть такая замена. Потрясающие :) – Andrew Gunnerson 4 January 2013 в 10:40
  • 2
    @xiao Если вы оставите %, он выполнит замену для первого экземпляра найденной строки; вы также можете использовать #, чтобы он заменил строку только в том случае, если она находится в start переменной; поэтому $ {0 / mp4 / m4a} заменит первый экземпляр mp4 на m4a (что может быть проблемой, если у вас действительно странные имена файлов); и $ {0 / # mp4 / m4a} будет заменять mp4 на m4a, но только если строковое значение переменной начинается с mp4 (здесь нечего использовать, очевидно, но это может пригодиться в другом месте). – evilsoup 4 January 2013 в 16:45

Чтобы избежать одновременного обработки нескольких файлов (которые могут использовать слишком много ресурсов), используйте parallel. По умолчанию он выполняет только одно задание за раз. Если вы хотите использовать несколько ядер процессора параллельно, попробуйте parallel -j 4 ... для 4 заданий параллельно. Также проверьте man parallel.

sudo apt-get install parallel

Эта строка будет извлекать аудиофайлы aac из выбранных видео и помещать их в контейнеры m4a.

parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F

При работе прямо в CLI, замените %F на список ваших входных файлов. Например. *.mp4.

Вдохновленный этим ответом, предыдущим ответом на этот вопрос и комментариями evilsoup к последнему (говоря: «raw aac-файлы не могут содержать метаданные, если вы хотите сохранить метаданные из исходных файлов, затем используйте m4a (это просто другое имя для mp4, но довольно широко признано аудиоплееры) вместо aac в качестве расширения файла »).

Я использую такие команды в пользовательских действиях Thunar ,

ограничение приложения на видео, содержащее аудио aac.

enter image description here

Чтобы иметь окно терминала открывается во время обработки, которое закрывается в конце, команда может быть изменена следующим образом:

 gnome-terminal -e "parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F"
3
ответ дан 25 May 2018 в 02:47

Я продлил ответ @ 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
2
ответ дан 25 May 2018 в 02:47

Другие вопросы по тегам:

Похожие вопросы: