У меня 228 файлов mp4 (2,6 ГБ) и я хочу извлечь из них аудио (mp3 или ogg). Я хочу извлечь их из партии - желательно с помощью bash. Я не уверен, что все файлы используют один и тот же аудиокодек, как они были записаны в разные годы, начиная с 2006-2012 гг.
Я хочу просмотреть их все, выбрать имя файла, определить аудиокодек и использовать ffmpeg для извлечения звука.
Возможно ли это?
Вы говорите, что хотите "извлечь аудио от них (mp3 или ogg)". Но что, если аудио в mp4 файле не является одним из тех? необходимо было бы транскодировать так или иначе. Итак, почему бы не оставить обнаружение формата аудио до ffmpeg?
Преобразовать один файл:
ffmpeg -i videofile.mp4 -vn -acodec libvorbis audiofile.ogg
Преобразовать много файлов:
for vid in *.mp4; do ffmpeg -i "$vid" -vn -acodec libvorbis "${vid%.mp4}.ogg"; done
Можно, конечно, выбрать любые ffmpeg параметры для аудиокодирования, которое Вы любите, для установки вещей как скорость передачи и так далее.
Использовать -acodec libmp3lame
и измените расширение от .ogg
кому: .mp3
для кодирования mp3.
Если то, что Вы хотите, должно действительно извлечь аудио, можно просто "скопировать" аудиотрек в использование файла -acodec copy
. Конечно, основное различие - то, что транскодирование является медленным и интенсивным CPU, в то время как копирование действительно быстро, поскольку Вы просто перемещаете байты от одного файла до другого. Вот то, как скопировать просто аудиотрек (предполагающий, что это находится в mp3 формате):
ffmpeg -i videofile.mp4 -vn -acodec copy audiofile.mp3
Обратите внимание, что в этом случае, формат аудиофайла должен согласовываться с тем, что имеет контейнер (т.е. если аудио является форматом AAC, необходимо сказать audiofile.aac
). Можно использовать ffprobe
команда для наблюдения, какой кодек Вы имеете это может предоставить некоторую информацию:
ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "videofile.mp4"
Возможный способ автоматически проанализировать аудиокодек и назвать звуковой файл соответственно был бы:
mkdir -p output
# current directory has to contain at least one .mp4 file
for vid in *.mp4; do
codec="$(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "$vid")"
case "$codec" in
mp3 ) filetype=mp3 ;;
vorbis ) filetype=ogg ;;
* ) filetype= ;;
esac
if [ "$filetype" ]; then
ffmpeg -i "$vid" -vn -acodec copy output/"${vid%.*}"."$filetype"
else
ffmpeg -i "$vid" -vn -acodec libvorbis output/"${vid%.*}".ogg
done
Примечания: выходные файлы создаются в подкаталоге output
это создает в начале (при необходимости). Для других кодеков, чем mp3 и vorbis это преобразовывает аудио в ogg. Ubuntu 14.04 не имеет ffmpeg в стандартных репозиториях, но Вы могли добавить ppa:mc3man/trusty-media репозиторий и установить ffmpeg пакет для получения необходимого программного обеспечения. Посмотрите здесь для деталей.
Как заявил Николас Рауль, это нужно обновить. Вот та же строка, которую дал roadmr, но вместо этого использовал avconv:
for vid in *.mp4; do avconv -i "$vid" "${vid%.mp4}.mp3"; done