понедельник, 7 сентября 2009 г.

Bash скрипт для конвертации lossless m4a в mp3

Понадобилось конвертировать lossless m4a в mp3, ибо плеер тянет только последний формат.
Обычно конверчу любые аудио файлы с помощью perl audio converter(pacpl) .И раньше он справлялся без проблем.
А тут выдал ошибку.Оказывается библиотека faad, которую pacpl использует, не поддерживает данный тип конвертации.Поэтому набросал небольшой скрипт, который перегоняет файл в wav, а затем скармливает уже его pacpl.На вход скрипт принимает директорию где лежат m4a файлы, или один m4a файл.Если есть вложенные поддиректории с m4a,со скрипт их тоже сконвертирует.В результате mp3 файлы будут сложены в директории где лежат оригинальные m4a файлы.
Требует:
1.lame
2.mplayer

#!/bin/bash
IFS=$'\n'
#read parent directory/file to scan the m4a files inside.Possible values are directory/single m4a file
dir="$1"

#set source,temp and destination file extensions
sExt="m4a"
tExt="wav"
dExt="mp3"

echo "scan $dir"
tmp1=`tempfile`

find "$1"|grep $sExt > $tmp1
for i in `cat $tmp1`
do
dir=`dirname "$i"`
filename=`basename "$i" .$sExt`
fullname=$dir"/"$filename"."$tExt
fullmp3name=$dir"/"$filename"."$dExt

#remove the old files and pipe if exist
if [ -e $fullmp3name ] ;then
rm -fr $fullmp3name
fi
if [ -e $fullname ] ;then
rm -fr $fullname
fi
#make pipe for conversation
mkfifo $fullname
echo "converting $i"
lame -b 320 "$fullname" "$fullmp3name"&
mplayer -ao pcm "$i" -ao pcm:file="$fullname"
#pacpl --to MP3 --bitrate 320 --freq 48000 "$fullname"
#remove named pipe
rm -fr "$fullname"
done
rm -fr $tmp1


Ну или можно скачать тут

Update:
По совету ffsdmad изменил скрипт таким образом, чтобы он использовал пайпы. Это избавило от создания временного wav файла большого размера.Также заменил использование pacpl для конвертации в mp3 на lame.Ибо последний корректно поддерживает работу с пайпами.Для mp3 используется битрейт 320.Заменил в посте и в линке старый скрипт на новый.Старый скрипт для сравнения лежит тут

Update 2
По совету arseny попробывал кодирование с помощью ffmpeg.Тоже отлично работает.
Следующая команда перегоняет lossless m4a в mp3 в качестве 320kb/s
ffmpeg -i "/mnt/multi/music/Pop Rock/Brainstorm [ALAC]/2000 - Among the Suns/02 Weekends Are Not My Happy Days.m4a" -ab 320k -ac 2 "/mnt/multi/music/Pop Rock/Brainstorm [ALAC]/2000 - Among the Suns/02 Weekends Are Not My Happy Days.mp3"
Сделаю позже новую версию скрипта, чтобы можно было выбирать чем кодировать

9 комментариев :

  1. Привет, я подобным образом пробовал конвертить большме аудиокниги, но вылезли проблемы - генерировались слишком большие WAV файлы
    и вот что у меня получилось http://breys.ru/blog/240.html

    ОтветитьУдалить
  2. Cпасибо!
    Просто великолепное решение.
    Сейчас будет апдейт скрипта :)

    ОтветитьУдалить
  3. % ffmpeg -i <входной файл> <параметры кодирования> <выходной файл>

    ?

    ОтветитьУдалить
  4. спасибо, попробую ffmpeg,
    тут вся фишка будет в том держит ли он lossless m4a

    ОтветитьУдалить
  5. спасибо, решение с ffmpeg тоже работает
    проапдейтил свою статью

    ОтветитьУдалить
  6. Супер :) Как раз мобила не поддерживает lossless-форматы, а вся музыка на компьютере в нем.

    ОтветитьУдалить
  7. Скрипт достаточно универсальный, в нем достаточно заменить sExt="m4a" на sExt="flac" или любой другой формат , поддерживаемый mplayer .Либо просто передавать расширение как параметр

    ОтветитьУдалить
  8. sExt="m4a" на sExt="flac"
    как страшно жить
    давно с MFC слезли?

    ОтветитьУдалить
  9. никогда не писал вод виндовс на mfc)
    конечно надо просто передавать расширение параметром.
    а что там в mfc похожего на sExt="m4a" на sExt="flac" ?

    ОтветитьУдалить