понедельник, 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"
Сделаю позже новую версию скрипта, чтобы можно было выбирать чем кодировать

суббота, 5 сентября 2009 г.

Новые внешний вид в амарок 2.1.80

На новом компе свежеустновленный amarok-.2.1.1 постоянно выдавал краш на выходе.Связано это было с ошибкой создания mysql базы.Уж не знаю отчего.
Вобщем решил ради интереса обновить амарок до нестабильной 2.1.80 версии и посмотреть , вдруг ошибку исправили.
В итоге,несмотря на то , что как крашилось так и крашится , значительно улучшился внеший вид и возможности по его изменению:
  • Наконец-то можно убрать огромные кнопки для проигрывания и заменить их на вполне опрятные
  • все видимые компоненты амарока легко закрыть открыть
  • можно перетащить видимые компоненты как нравится в несколько кликов
Честно говоря, я точно оставлю нестабильный пакет ради нормального вида кнопок :)
Вот что получилось у меня:
Или вот так:

Хотел записать видео , да qt-recorddesktop тормозит на Intel GM965.Буду признателен , если кто подскажет в чем дело. На втором буке на nvidia все работает отлично.

среда, 2 сентября 2009 г.

Как залогировать kernel panic когда она пришла к тебе

Купил себе новый бук.Поставил туда gentoo (gentoo-sources-2.6.30-r6) и буквально на второй день система стала намертво зависать при запуске компиляции больших пакетов как gcc .И выбрасывать собственно kernel panic в консоль.Вопрос стал в том как эту панику выловить , так как клава и мышка отваливаются, в messages ничего не пишется.Только Капс и Нам лок мигают.Словом, как буд-то резко вырубили електричество.
А без этого нужного кернел паник лога ошибку фиг найдешь.
Оказывается , способ есть :) Что я сделал:
Требования: требуется еще одна машина в той же сети . А также на машине , где происходит kernel panic обязательно должен быть обычный сетевой(тот что не wifi) интерфейс
1.На хосте где происходит паника убеждаемся что в ядре установлен модуль netconsole .Установлен в виде модуля

cat /boot/config|grep NETCONSOLE
CONFIG_NETCONSOLE=m

2.Разрешаем посылку UDP сообщений по сети между вашими двумя машинами.У меня сеть из 2 компов, поэтому они включены изначально.
3.Подгружаем модуль командой

modprobe netconsole netconsole=6969@192.168.1.36/eth0,6969@192.168.1.33/00:18:de:e1:79:2b

где
192.168.1.36/eth0 - ай пи адрес и имя сетевого интерфейса на машине, где происходит kernel panic.У меня заработало только при условии, что eth0 - это обычная, сетевая плата, не wifi
192.168.1.33/00:18:de:e1:79:2b - ай пи адрес и мак адрес машины, которая будет принимать логи
Запустите dmesg для проверки - в /var/log/messages должно появится сообщение, что модуль netconsole загружен и логирование активировано
4.Теперь идем на машину которая будет принимать логи и в консоли запускаем команду

nc -u -l -p 6969

Если такой команды нету, устанавливаем netcat

Cобственно все, в эту консоль у вас будут валиватся сообщения с удаленной машины. И , в частности, так "нужный"
kernel panic

При желании к этой фиче можно добавить
1. Писать логи в syslog на удаленной машине вместо консоли
2. динамически изменять конфигурацию netconsole - куда и откуда слать логи.
Но тут уж google вам в помошь и /usr/src/linux/Documentation/networking/netconsole.txt

Отчего паника возникает у меня пока не разобрался , вот засабмитил баг в gentoo.Там и полный trace.Буду очень признателен если кто-то с таким сталкивался и сможет помочь