Как использовать 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