як я можу отримати пакетний витяг аудіо з файлів mp4 за допомогою ffmpeg без декомпресії (автоматичне виявлення аудіокодеків)?


19

У мене є 228 файлів mp4 (2,6 ГБ) і я хочу витягти з них аудіо (mp3 або ogg). Я хочу їх витягнути - бажано з башем. Я не впевнений, чи всі файли використовують той же аудіокодек, який вони були записані в різні роки, починаючи з 2006-2012 років.

Я хочу переглядати всі вони, вибрати ім'я файлу, виявити аудіокодек і використовувати ffmpeg для вилучення звуку.

Це можливо?


Це питання сценарію, і як таке не має нічого спільного з Ubuntu. Тут справа не в темі, але SO або unix.SE може бути кращим питанням.
Махеш

Спасибі. Наступного разу я спробую задати таке питання в більш підходящому місці.
wryrych

Відповіді:


29

Ви кажете, що хочете "витягти з них аудіо (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. Звичайно, головна відмінність полягає в тому, що перекодування є повільним та процесорно-інтенсивним, тоді як копіювання дійсно швидке, оскільки ви просто переміщаєте байти з одного файлу в інший. Ось як скопіювати лише аудіозапис (якщо припустити, що це у форматі 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, щоб отримати необхідне програмне забезпечення. Детальніше дивіться тут .


Я неправильно поставив Я хотів мати mp3 або ogg, але, як ви помітили, звуковий кодек був іншим - AAC у цьому прикладі. Тому мені доведеться все-таки перекодувати їх. Велике спасибі за вашу допомогу!
wryrych

Ваш автоматичний приклад розбивається з іменами файлів, у яких є пробіли, оскільки ви не цитували $ файл у підзаяві ffprobe. Змінивши його на: для файлу в * mp4 * avi; зробіть ffmpeg -i "$ file" -vn -acodec копію "$ файл". ffprobe "$file" 2>&1 |sed -rn 's/.*Audio: (...), .*/\1/p'; зробив це виправлення.
Ендрю Білс

+1, але схоже, що ця відповідь може використати оновлення:This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Ніколас Раул

ffmpegабо ffprobeне доступні для Ubuntu 14.04 або новішої версії.
jarno

1
@jarno Справжній ffmpeg повернувся до Ubuntu в 15.04 , і він схожий на ливаду Libav avconvі avprobeбув видалений у 15.10 .
логіан

1

Як заявив Ніколя Рауль, для цього потрібно оновити. Ось той самий рядок, що і Roadmr, але замість цього використовує avconv:

for vid in *.mp4; do avconv -i "$vid" "${vid%.mp4}.mp3"; done


Зараз це застаріло. FFmpeg повернувся, а Лібава вже немає.
логікан

Абсолютно правильно. Якщо хтось думав, що ffmpeg помре, прочитайте це: en.wikipedia.org/wiki/Libav#Confusion
Scooby-2,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.