Как преобразовать звуковой файл m4a в mp3?

Я хотел бы принять другой подход к этому из других ответов и бросить вызов понятию, что «Linux» или «Windows» имеют к этому какое-либо отношение (нести меня).

концепция расширения файла может быть просто выражена как «соглашение для идентификации типа файла на основе части его имени». Другие общие соглашения для идентификации типа файла сравнивают его содержимое с базой данных известных подписей (подход «магического числа») и сохраняют его как дополнительный атрибут файловой системы (подход, используемый в исходном MacOS) .

Поскольку каждый файл в системе Windows или Linux имеет как имя, так и содержимое, процессы, которые хотят знать тип файла, могут использовать либо «расширение», либо «магическое число», как они видят поместиться. Подход метаданных обычно недоступен, так как в большинстве файловых систем нет стандартного места для этого атрибута.

В Windows существует традиция использования расширения файла в качестве основного средства идентификации файла ; наиболее очевидно, что графический браузер файлов (File Manager в Windows 3.1 и Explorer в современных Windows) использует его, когда вы дважды щелкаете по файлу, чтобы определить, какое приложение запускаться. В Linux (и, в более общем плане, системах на базе Unix) существует более традиционная проверка содержимого; прежде всего, ядро ​​смотрит в начало файла, выполняемого непосредственно, чтобы определить, как его запустить; файлы сценариев могут указывать на использование интерпретатора, начиная с #!, за которым следует путь к интерпретатору.

Эти традиции влияют на дизайн пользовательского интерфейса программ, написанных для каждой системы, но есть много исключений, поскольку каждый подход имеет плюсы и минусы в разных ситуациях. Причины использования расширений файлов, а не изучения содержимого, включают:

рассмотрение содержимого файла довольно дорого по сравнению с рассмотрением имен файлов; поэтому, например, «найти все файлы с именем * .conf» будет намного быстрее, чем «найти все файлы, первая строка которых соответствует этой сигнатуре», содержимое файла может быть неоднозначным; многие форматы файлов на самом деле являются только текстовыми файлами, обработанными особым образом, многие другие являются специально структурированными zip-файлами, а определение точных подписи для них может быть сложным, так как файл действительно может быть действительным как несколько типов; HTML-файл также может быть действительным XML, zip-файл и объединенный вместе GIF-файл остаются действительными для обоих форматов. Сопряжение магического номера может привести к ложным срабатываниям; формат файла, который не имеет заголовка, может начинаться с байтов «GIF89a» и быть неверно идентифицированным как изображение GIF, переименовав файл, может быть удобным способом пометить его как «отключенный»; например изменение «foo.conf» на «foo.conf ~», чтобы указать, что резервная копия проще, чем редактирование файла, чтобы прокомментировать все его директивы и удобнее, чем перемещать его из автозагружаемого каталога; Аналогично, переименование файла .php на .txt будет сообщать Apache, чтобы он служил своим источником как обычный текст, а не передавал его в PHP-движок

Примеры программ Linux, которые по умолчанию используют имена файлов (но могут иметь другие режимы):

рассмотрение содержимого файла довольно дорого по сравнению с рассмотрением имен файлов; поэтому, например, «найти все файлы с именем * .conf» будет намного быстрее, чем «найти все файлы, первая строка которых соответствует этой сигнатуре». gcc будет обрабатывать файлы «.c» как C и «.cc» или «.C» как C ++
49
задан 12 October 2011 в 00:17

6 ответов

Я создал скрипт для этого.

Мои требования были:

  • Должен поддерживать как можно больше тегов
  • Необходимо сохранить обложку альбома if exists
  • Должно быть 320K mp3s

Работает со всеми файлами m4a в каталоге и выводит новые блестящие Mp3 в папку, созданная сценарием под названием Mp3. Предупреждение; этот скрипт перезаписывает существующие Mp3-файлы в выходной папке, если они имеют одно и то же имя. Также использует файлы metadata.txt и metadata2.txt как временные файлы.

Вам нужно будет установить avconv, если он еще не существует.

Я не мог " t выяснить, как сохранить тег 'Year' в тегах ID3v1, поэтому я не включил этот параметр.

#!/bin/bash
files=*.m4a
#create output folder if it doesnt exist
if [ ! -d Mp3 ]; then
        mkdir Mp3
fi

for file in $files; do
        mp3File=${file/%m4a/mp3}
        avconv -y -i "${file}" -f ffmetadata metadata.txt
        sed -e 's/^date=\(.*\)$/TYER=\1/' -e 's/^major_brand=.*$//' -e 's/^minor_version=.*$//' -e 's/^creation.*$//' -e 's/^compatible.*$//' -e 's/^encoder=.*$//' <metadata.txt >metadata2.txt
        avconv -y -i "${file}" -i metadata2.txt -ab 320k -map_metadata 1 -id3v2_version 3 "Mp3/${mp3File}"
done

Сохраните его как 'convert.b', а затем запустите скрипт, набрав:

% bash convert.b
5
ответ дан 25 July 2018 в 21:12

Мне нужно альтернативное решение, потому что - мои файлы сидели в рекурсивных подкаталогах - у меня были пробелы в путях.

Итак, я в конце концов решил:

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

Затем удалил исходные файлы:

find . -type f -name '*.m4a' -exec bash -c 'rm "$0"' '{}' \;
13
ответ дан 2 August 2018 в 02:52

Мне нужно альтернативное решение, потому что - мои файлы сидели в рекурсивных подкаталогах - у меня были пробелы в путях.

Итак, я в конце концов решил:

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

Затем удалил исходные файлы:

find . -type f -name '*.m4a' -exec bash -c 'rm "$0"' '{}' \;
13
ответ дан 6 August 2018 в 03:05

Иногда avconv и ffmpeg работают не так чисто, поэтому:

sudo apt-get install faad lame
faad myfile.m4a
lame myfile.wav myfile.mp3

всегда работает для меня.

3
ответ дан 7 August 2018 в 20:47

Вероятно, вам нужны неограниченные libav-пакеты в репозитории medibuntu. Лично я собирал последнюю ffmpeg со всеми кодеками, так же просто, как 123 http://ubuntuforums.org/showthread.php?t=786095

1
ответ дан 10 August 2018 в 09:08

Мне нужно альтернативное решение, потому что - мои файлы сидели в рекурсивных подкаталогах - у меня были пробелы в путях.

Итак, я в конце концов решил:

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

Затем удалил исходные файлы:

find . -type f -name '*.m4a' -exec bash -c 'rm "$0"' '{}' \;
13
ответ дан 13 August 2018 в 12:32
  • 1
    – Mark Slater 13 January 2017 в 02:14
  • 2
    Я изменил команду, добавив -y и -b: 256k, чтобы убедиться, что программа не перестает запрашивать разрешение на перезапись существующих mp3-файлов и для лучшего качества (хотя я не признавал разницу между стандартным выходом из 128 Кбит / с (что было только в половине битрейта, которое было у моего оригинального m4a): find. -type f -name '* .m4a' -exec bash -c 'avconv -i & quot; $ 0 "-y ​​-b: a 256k "$ {0 /% m4a / mp3}" '' {} '\; – Ben 7 October 2017 в 01:52

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

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