Как использовать Ffmpeg для рекурсивного преобразования wma в mp3, импортируя из txt файла?

Я пробовал разные варианты на форумах, но большинство из них устарели (ffmpeg говорит мне об этом, как с опцией -sameq). Я пытаюсь понять документы, но не могу.

Я хочу знать, как рекурсивно конвертировать с помощью ffmpeg из wma в mp3 с максимальным битрейтом 192 кбит / с на выходе (но не 192, если оригинал был 128 кбит / с)

У меня есть, если 14K WMA файлы распространяются во многих каталогах. Поэтому я не хочу их перемещать. Просто преобразуйте их, сохраняя имя файла и метаданные, и удалите их, если можно будет прочитать список файлов для преобразования из txt-файла, который я могу создать, по одному файлу на строку. С этим мне удалось бы сделать рекурсивный поиск, вставить в него.

Спасибо за любую помощь. И еще больше спасибо за любое объяснение о Ffmpeg.

Caroxo

PS: Soundconverter раньше был хорошим, но медленным. Теперь ни того, ни другого. Не работает в 14.04 во многих случаях, как у меня. Я использую Soundkonverter, но очень медленно. Итак, все это для предотвращения этой рекомендации. И я хочу научиться использовать этот мощный ffmpeg! и CLI

ПРИМЕЧАНИЕ: скрипт, приведенный ниже, работал в первых преобразованиях. Но по любой причине, которую я не могу объяснить, внезапно удалил wma в конвертации, не выходя из mp3. Итак, я снова изменил на "неразрешенный" (чтобы не допустить время от времени проблемы с кем-то еще). Кажется, проблема исходит от avconv: "Приложение предоставило недопустимое немонотонное увеличение dts для мультиплексора в потоке 0: 23606 >= 21720"(в комментариях есть вставки, если кто-то заинтересован в разработке этой ошибки). Таким образом, нет avconv в будущем.

6 ответов

Это команда, которую я использую для ffmpeg всех файлов в текущем каталоге (работает, если в именах есть пробелы) на Mac, где brew не имеет avconv:

for file in *.wma; do ffmpeg -i "${file}"  -acodec libmp3lame -ab 192k "${file/.wma/.mp3}"; done

В терминале сначала перейдите в папку, содержащую всю вашу музыку, используя cd, например:

cd /home/username/music/wma-to-convert

Следующее создаст список всех файлов в текущей папке и всех подпапках, оканчивающихся на "wma", и сохранит список в текстовом документе с именем wma-files.txt:

find . -type f | grep wma$ > wma-files.txt

Или вы можете создать текстовый файл вручную, если хотите. Затем введите следующее в текстовом редакторе и сохраните его в том же каталоге wma-files.txtнапример, назвав его conv-script:

#!/usr/bin/env bash

readarray -t files < wma-files.txt

for file in "${files[@]}"; do
    out=${file%.wma}.mp3
    probe=`avprobe -show_streams "$file" 2>/dev/null`
    rate=`echo "$probe" | grep "^bit_rate" | sed "s:.*=\(.*\)[0-9][0-9][0-9][.].*:\1:" | head -1`
    ffmpeg -i "$file" -ab "$rate"k "$out"
done

Вы, вероятно, должны установить исполняемый бит в скрипте:

chmod +x conv-script

Тогда просто запустите это:

./conv-script

У вас также есть возможность добавить это в конце ffmpeg линия, но будьте осторожны:

 && rm "$file"

Для тех, у кого нет доступа к avprobe, вы можете использовать ffprobe, который делает эквивалент (то есть получает bit_rate). Для этого:

Заменить:

probe=`avprobe -show_streams "$file" 2>/dev/null`
rate=`echo "$probe" | grep "^bit_rate" | sed "s:bit_rate=\([0-9]\+\)[0-9]\{3\}:\1:" | head -1`

с:

rate=`ffprobe -v error -show_entries format=bit_rate -of default=noprint_wrappers=1:nokey=1 "$file"`

Как только это будет сделано, все ваши файлы должны начать конвертироваться, а оригиналы wma должны быть удалены! Это прекрасно работает для меня, конвертируя файлы flac в mp3. К сожалению, у меня нет wma для тестирования, но я ожидаю, что он подойдет и для них.

ПРИМЕЧАНИЕ. Хотя проблем не предвидится, было бы неплохо скопировать несколько файлов в новый каталог и проверить их на них.

Если вы планируете часто конвертировать Wma в mp3, приведенный ниже скрипт автоматически конвертирует и удаляет все в папке, указанной в качестве аргумента. Это немного улучшает вышеупомянутое. Кроме того, команда ffmpeg немного отличается от предложенной первой, если первая не работает, используйте приведенную ниже.

#!/usr/bin/env bash

cd "$1"
find . type f | grep wma$ > wma-files.txt

readarray -t files < wma-files.txt

for file in "${files[@]}"; do
    out=${file%.wma}.mp3
    ffmpeg -i "$file" -map_metadata 0:s:0 $out"
done
rm wma-files.txt

Затем вы просто вызываете его, набирая свой терминал как:

./convScript /home/username/music

Таким образом, вся музыкальная папка и ее подпапки будут иметь свою музыку wma, автоматически преобразованную в mp3.

Как и раньше, вы можете добавить это в конец ffmpeg строка для удаления файла:

&& rm "$file"

РЕДАКТИРОВАТЬ (2017/06/23): не делать rm по умолчанию

Для любой версии

Я нашел хороший способ сделать это с помощью mplayer. Этот скрипт переименует файлы, чтобы удалить все пробелы в именах файлов, и рекурсивно преобразует все файлы.wma в текущем каталоге в.mp3:

#!/bin/bash
for f in *.wma; do
 newname=`echo $f | tr ' ' '_' `
 mv "$f" $newname
 f=$newname
 mplayer $f -novideo -ao pcm:file=tmp.wav
 lame -V 0 -q 0 tmp.wav ${f/.wma/.mp3}
 rm -f tmp.wav
done

Вот версия с одним вкладышем:

for f in *.wma; do; newname=`echo $f | tr ' ' '_' `; mv "$f" $newname; f=$newname; mplayer $f -novideo -ao pcm:file=tmp.wav; lame -V 0 -q 0 tmp.wav ${f/.wma/.mp3}; rm -f tmp.wav; done

Я переписываю скрипт TheSchwa (спасибо TheSchwa!) Со следующими изменениями:

  • Обнаружение avprobe работает (по крайней мере на ffprobe версии 2.5.2 из текущей нестабильной версии Debian).
  • Не удаляйте файлы с rm (Конвертеры обычно не удаляют файлы, это может быть большим сюрпризом!).
  • Загрузите файлы wma в скрипт.
  • Помогите, если отсутствуют двоичные файлы
#!/bin/bash

which ffmpeg > /dev/null || { echo "Install ffmpeg, with 'sudo apt-get install ffmpeg'" >&2; exit 1; }
which avprobe > /dev/null || { echo "Install libav-tools, with 'sudo apt-get install libav-tools'" >&2; exit 1; }

output_format=mp3
file=`mktemp`
find . -type f | grep -i wma$ > $file

readarray -t files < $file

for file in "${files[@]}"; do
    out=${file%.wma}.$output_format
    probe=`avprobe -show_streams "$file" 2>/dev/null`

    rate=`echo "$probe" | grep "^bit_rate" | sed "s:bit_rate=\([0-9]\+\)[0-9]\{3\}:\1:" | head -1`
    ffmpeg -i "$file" -ab "$rate"k "$out"
done

Примечание: следующее не относится к 15.04, 15.10 или 16.04

Первый:

В любом случае ffmpeg устарела в 14.04, и теперь вы должны использовать avconv вместо.

sudo apt-get install avconv

Используйте эту команду для рекурсивного преобразования файлов wma в mp3:

for i in `find . -type f -name '*.wma'`; do avconv -i "$i" "${i/.wma/.mp3}"; done

Затем, после проверки качества файлов, вы можете запустить эту команду, чтобы рекурсивно удалить или удалить исходные версии.wma:

for i in `find . -type f -name '*.wma'`; do rm "$i"; done

Следующий:

Вот как использовать команду в сценарии (с именем "wma2mp3"):

sudo nano /usr/local/bin/wma2mp3

скопируйте и вставьте это в файл:

#!/bin/bash
for i in `find . -type f -name '*.wma'`; do avconv -i "$i" "${i/.wma/.mp3}"; done

Нажмите Ctrl + O, а затем нажмите Enter, чтобы сохранить файл и используйте Ctrl + X для выхода.

Затем сделайте файл исполняемым с помощью следующей команды:

sudo chmod +x /usr/local/bin/wma2mp3

Теперь вы можете просто запустить команду wma2mp3 рекурсивно конвертировать все файлы WMA в mp3.

Просто сделайте то же самое со скриптом, чтобы стереть все файлы wma и назовите его как хотите.


Кстати, если вы просто хотите преобразовать все файлы только в текущем каталоге (не во всех других последующих рекурсивных каталогах), вы можете использовать эту команду вместо этого:

for i in *.wma; do avconv -i "$i" "${i/.wma/.mp3}"; done

и, конечно, чтобы удалить файлы wma только в текущем каталоге, просто используйте эту команду:

rm *.wma

Это скрипт bash, использующий параллель:

#!/bin/bash

parallel -i -j$(nproc) ffmpeg -i {} -acodec libmp3lame -ab 192k {}.mp3 ::: ./*.wma
rename 's/.wma//' *.wma.mp3
Другие вопросы по тегам