LINUX.ORG.RU

Небольшой sh скрипт запуска отдельных треков DVD караоке


1

1

Задача. Хочу устроить караоке party. У меня есть n-ное количество DVD караоке образов (iso). Хочу с помощью плей листа и mplayer проигрывать отдельные (выбранные участниками) песни с разных дисков не открывая каждый раз меню диска (dvdnav://) Задача в целом выполнена. Скрипт проигрывания отдельных треков готов и обкатан. (листинг ниже). Проблема как раз в маленьком дополнительном скрипте, который считывает файл плейлиста и в цикле вызывает скрипт проигрывания и подставляет два параметра из файла плейлиста - номер диска и номер песни.

Исходные данные.

  • Операционка OpenSUSE 12.2 (ядро стоковое, ничего не пересобирал)
  • Есть образы (iso) DVD караоке дисков.
  • Mplayer установлен из официальных репов SUSE.
  • Файлы образов расположены в одном каталоге и названы 1-хх.iso 2-хх.iso... пронумерованы для удобства
  • Структура DVD караоке такова: Один или несколько title (почему не один title не знаю, не я ихмо делал) и куча chapter. Каждый chapter это отдельная песня. Причем, может быль 2 title: на 1-ом (title 1) 89 чаптеров, а на 2-ом (title 2) 31 чаптер, а если обратиться к меню диска или обложке, то там нумерация песен сквозная т.е. от 1 до 120 (89+31=120). Т.е. например песня под номером 101 это фактически title 2 / chapter 12 (101-89=12). Соответственно пришлось немного повозиться чтобы вычислить нужный title и chapter. Еще одна особенность - там может быть и title 3 с 1-2-мя чаптерами на которых фактически меню диска. Такой title исключаю проверкой количества чаптеров.

    Вот листинг скрипта проигрывания отдельных песен
    (/usr/sbin/karaoke)
    
    #!/bin/sh
    
    pth=/run/media/michael/WD_Disk/Караоке/
    song=$2
    
    ARGS=2
    E_BADARGS=65 
    
    if [ $# -ne "$ARGS" ] ; then
        echo "Порядок использования: `basename $0` имя(номер)-диска номер-песни"
        exit $E_BADARGS
    fi
    
    name=`ls $pth | grep -m 1 ^$1`
    
    if [ -z "$name" ] ; then
    echo "Файл DVD не найден"
    exit 0
    fi
    
    name=$pth$name
    
    title=$(lsdvd -v "$name" 2>/dev/null | grep ^Title | awk '{print $4}' | wc -l)
    total=0
    
    for ((i=1; i <= title; i++))
        do
        chapter=$(lsdvd -t $i -v "$name" 2>/dev/null | grep ^Title | awk '{print $6}' | sed 's/,//g' | sed 's/^0//')
        if [ "$chapter" -gt 2 ] ; then
    	chapter[$i]=$chapter
    	total=$((total+chapter[$i]))
        else 
    	title=$((title-1))
        fi 
        done
    
    if [ "$song" -gt "$total" ] ; then
        echo "Нет такого номера песни на этом диске"
        exit 0
    fi
    
    for ((index=1; song > chapter[$index] && index <= title; index++))
        do
        song=$((song-chapter[$index]))
        done
    
    # DVD angle recognizer
    angle=$(mplayer dvd://$index -dvd-device "$name" -nosound -vo null -frames 0 2>/dev/null | grep -E -w -o '[0-9]{1,2}\sangles' | sed 's/\sangles//')
    
    # Play video
    mplayer dvd://$index -dvd-device "$name" -chapter $song-$song -vo x11 -ao alsa -alang ru -dvdangle $angle -fs -zoom -framedrop -cache 2000 -really-quiet -stop-xscreensaver
    

    А вот скриптик проигрывания плей листа (который НЕ работает) Файл плейлиста считывается и передает два параметра (номер диска и номер песни) в вышеуказанный скрипт, но почему то на mplayer вываливается. Башку уже сломал. А еще ниже скрипт который работает, но кривой и не кошерный (не могу я так).
    #!/bin/sh
    while read line ; do
    /usr/sbin/karaoke $line
    sleep 3
    done <playlist
    

    А вот так работает!!!!
    #!/bin/sh
    index=1
    while read line ; do
    song[$index]=$line
    index=$((index+1))
    done <playlist
    
    for ((i=1; i<index; i++)) ; do
    /usr/sbin/karaoke ${song[$i]}
    sleep 3
    done
    

    Вот файл плейлиста (cat playlist). Первый параметр в нем, например 1-2- это начало имени файла (Например 1-2-песни из кино.iso), второй номер песни.
    1-2- 13
    2- 29
    10- 4
    11- 27
    1-1 101
    22- 12
    24- 73
    15- 66
    1-1- 102
    

    Ребята, не посылайте только в google - я там уже был )). Не могу реально понять в чем дело. Ну должен же скриптик тот маленький работать. Просто обязан. Уперся в стену и никак не могу сдвинуться. Понимаю, что дело в какой то ерунде, но никак не пойму в какой!

Не осилил ибо реально много букав.
Два совета
- подебажь с bash -x (вначале ставишь #!/bin/bash -x) и strace (strace -f имя скрипта) - увидишь что где почему падает.
- убедись, что имена файлов с пробелами твой велосипед нормально обрабатывает

zolden ★★★★★ ()
Ответ на: комментарий от zolden

Спасибо.

  • По первому пункту ниче не видно и с -x, так как сам скрипт робит нормально. Вываливается именно mplayer. Попробую ему задать параметров, чтобы больше инфы в консоль плевал.
  • По второму пункту все нормально, так как отдельнозапущенный скрипт karaoke отрабатывает как надо.
bearpuh ()
Ответ на: комментарий от bearpuh

потрейси какие параметры передаются mplayer'у и посмотри

strace mplayer dvd://$index -dvd-device "$name" -chapter $song-$song -vo x11 -ao alsa -alang ru -dvdangle $angle -fs -zoom -framedrop -cache 2000 -really-quiet -stop-xscreensaver
если логи самого mplayerа не помогут

zolden ★★★★★ ()

Обрати внимание, что в работающем примере массив заполняется начиная с нулевого элемента, а в karaoke передается начиная с первого.

at ★★ ()
Ответ на: комментарий от at

Это очепятка. В рабочем скрипте index=1 перед циклом стоит. Здесь тоже поправил.

bearpuh ()
Ответ на: комментарий от zolden

Задал mplayer'у опцию -identify и вот что видим просто в консоли запускаю скрипт

/usr/sbin/karaoke 1-2 13

Скрипт отрабатывает нормально. Есть некоторая ругань от libdvdnav, но файл проигрывается нормально.
Вот вывод от mplayer
+mplayer dvd://1 -dvd-device '/run/media/michael/WD_Disk/Караоке/1-2-пьяное веселье.iso' -chapter 13-13 -vo x11 -ao alsa -alang ru -dvdangle 1 -fs -zoom -framedrop -cache 2000 -identify
MPlayer dev-SVN-r35127-4.7-openSUSE Linux 12.2 (i586)-Packman (C) 2000-2012 MPlayer Team
Can't open joystick device /dev/input/js0: No such file or directory
Can't init input joystick

Playing dvd://1.
libdvdread: Using libdvdcss version 1.2.12 for DVD access
ID_DVD_TITLES=1
ID_DVD_TITLE_1_CHAPTERS=100
ID_DVD_TITLE_1_ANGLES=1
Please send bug report - no VTS_TMAPT ?? 
ID_DVD_TITLE_1_LENGTH=10474.240
libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_02_0.IFO failed
libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_03_0.IFO failed
libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_04_0.IFO failed
libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_05_0.IFO failed
libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_06_0.IFO failed
libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_07_0.IFO failed
libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_08_0.IFO failed
libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_09_0.IFO failed
ID_DVD_DISC_ID=22C538377ACA631AE4B8B297637D9306
ID_DVD_VOLUME_ID=NEW
There are 1 titles on this DVD.

ID_DVD_CURRENT_TITLE=1
There are 1 angles in this DVD title.
Please send bug report - no VTS_TMAPT ?? 

libdvdread: Attempting to retrieve all CSS keys
libdvdread: This can take a _long_ time, please be patient

libdvdread: Get key for /VIDEO_TS/VIDEO_TS.VOB at 0x0000012e
libdvdread: Elapsed time 0
libdvdread: Get key for /VIDEO_TS/VTS_01_0.VOB at 0x00003e48
libdvdread: Elapsed time 0
libdvdread: Get key for /VIDEO_TS/VTS_01_1.VOB at 0x000040dd
libdvdread: Elapsed time 0
libdvdread: Found 1 VTS's
libdvdread: Elapsed time 0
audio stream: 0 format: mpeg1 (stereo) language: ru aid: 0.

ID_AUDIO_ID=0
ID_AID_0_LANG=ru
number of audio channels on disk: 1.
number of subtitles on disk: 0

CHAPTERS: 00:00:00.000,00:04:25.480,00:08:25.840,00:12:31.840,00:15:14.760,00:18:38.240,00:21:18.160,00:24:27.200,00:28:03.520,00:30:47.120,00:33:29.680,00:37:43.720,00:41:03.160,00:42:46.200,00:48:22.200,00:53:01.920,00:56:03.960,00:58:06.800,01:02:37.880,01:05:49.480,01:10:23.200,01:12:57.360,01:18:14.600,01:22:21.680,01:25:44.120,01:29:09.280,01:32:22.640,01:36:57.880,01:40:06.000,01:44:31.000,01:48:17.200,01:51:55.880,01:56:09.440,01:58:31.400,02:02:11.400,02:05:36.360,02:08:55.280,02:11:48.880,02:14:18.000,02:17:15.640,02:20:37.480,02:23:32.640,02:27:55.680,02:31:18.320,02:33:35.160,02:36:21.160,02:40:56.720,02:44:10.400,02:47:05.160,02:51:14.080,02:54:34.240,02:57:12.640,03:00:21.320,03:03:57.480,03:07:10.360,03:11:03.360,03:13:12.040,03:18:03.200,03:23:06.600,03:25:48.800,03:29:59.480,03:33:34.320,03:36:19.440,03:39:48.240,03:43:22.120,03:45:22.920,03:49:14.040,03:51:28.960,03:56:29.000,03:59:31.600,04:02:28.640,04:06:27.440,04:08:54.600,04:12:31.360,04:16:06.480,04:18:44.120,04:21:20.120,04:24:51.960,04:28:26.960,04:32:04.680,04:35:20.160,04:38:16.680,04:42:02.880,04:46:21.760,04:51:47.040,04:56:57.760,05:00:32.280,05:03:39.920,05:07:47.120,05:13:17.040,05:15:30.920,05:20:43.200,05:23:08.520,05:26:47.120,05:29:38.320,05:33:16.760,05:37:26.880,05:39:30.480,05:42:18.240,05:46:08.560,
Selected DVD audio channel: 0 language: ru
Cache fill:  0.00% (0 bytes)   

ID_VIDEO_ID=0
MPEG-PS file format detected.
ID_AUDIO_ID=0
VIDEO:  MPEG1  352x288  (aspect 8)  25.000 fps  1420.0 kbps (177.5 kbyte/s)
ID_FILENAME=dvd://1
ID_DEMUXER=mpegps
ID_VIDEO_FORMAT=0x10000001
ID_VIDEO_BITRATE=1420000
ID_VIDEO_WIDTH=352
ID_VIDEO_HEIGHT=288
ID_VIDEO_FPS=25.000
ID_VIDEO_ASPECT=0.0000
ID_AUDIO_FORMAT=80
ID_AUDIO_BITRATE=0
ID_AUDIO_RATE=0
ID_AUDIO_NCH=0
ID_START_TIME=0.29
ID_LENGTH=10474.24
ID_SEEKABLE=1
ID_CHAPTERS=100
.....

А вот вывод от mplayer если запустить скриптик play (тот который НЕ работает -:)

+ mplayer dvd://1 -dvd-device '/run/media/michael/WD_Disk/Караоке/1-2-пьяное веселье.iso' -chapter 13-13 -vo x11 -ao alsa -alang ru -dvdangle 1 -fs -zoom -framedrop -cache 2000 -identify
MPlayer dev-SVN-r35127-4.7-openSUSE Linux 12.2 (i586)-Packman (C) 2000-2012 MPlayer Team
Can't open joystick device /dev/input/js0: No such file or directory
Can't init input joystick

Playing dvd://1.
libdvdread: Using libdvdcss version 1.2.12 for DVD access
ID_DVD_TITLES=1
ID_DVD_TITLE_1_CHAPTERS=100
ID_DVD_TITLE_1_ANGLES=1
Please send bug report - no VTS_TMAPT ?? 
ID_DVD_TITLE_1_LENGTH=10474.240
libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_02_0.IFO failed
libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_03_0.IFO failed
libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_04_0.IFO failed
libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_05_0.IFO failed
libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_06_0.IFO failed
libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_07_0.IFO failed
libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_08_0.IFO failed
libdvdnav:DVDOpenFileUDF:UDFFindFile /VIDEO_TS/VTS_09_0.IFO failed
ID_DVD_DISC_ID=22C538377ACA631AE4B8B297637D9306
ID_DVD_VOLUME_ID=NEW
There are 1 titles on this DVD.

ID_DVD_CURRENT_TITLE=1
There are 1 angles in this DVD title.
Please send bug report - no VTS_TMAPT ?? 

libdvdread: Attempting to retrieve all CSS keys
libdvdread: This can take a _long_ time, please be patient

libdvdread: Get key for /VIDEO_TS/VIDEO_TS.VOB at 0x0000012e
libdvdread: Elapsed time 0
libdvdread: Get key for /VIDEO_TS/VTS_01_0.VOB at 0x00003e48
libdvdread: Elapsed time 0
libdvdread: Get key for /VIDEO_TS/VTS_01_1.VOB at 0x000040dd
libdvdread: Elapsed time 0
libdvdread: Found 1 VTS's
libdvdread: Elapsed time 0
audio stream: 0 format: mpeg1 (stereo) language: ru aid: 0.

ID_AUDIO_ID=0
ID_AID_0_LANG=ru
number of audio channels on disk: 1.
number of subtitles on disk: 0

CHAPTERS: 00:00:00.000,00:04:25.480,00:08:25.840,00:12:31.840,00:15:14.760,00:18:38.240,00:21:18.160,00:24:27.200,00:28:03.520,00:30:47.120,00:33:29.680,00:37:43.720,00:41:03.160,00:42:46.200,00:48:22.200,00:53:01.920,00:56:03.960,00:58:06.800,01:02:37.880,01:05:49.480,01:10:23.200,01:12:57.360,01:18:14.600,01:22:21.680,01:25:44.120,01:29:09.280,01:32:22.640,01:36:57.880,01:40:06.000,01:44:31.000,01:48:17.200,01:51:55.880,01:56:09.440,01:58:31.400,02:02:11.400,02:05:36.360,02:08:55.280,02:11:48.880,02:14:18.000,02:17:15.640,02:20:37.480,02:23:32.640,02:27:55.680,02:31:18.320,02:33:35.160,02:36:21.160,02:40:56.720,02:44:10.400,02:47:05.160,02:51:14.080,02:54:34.240,02:57:12.640,03:00:21.320,03:03:57.480,03:07:10.360,03:11:03.360,03:13:12.040,03:18:03.200,03:23:06.600,03:25:48.800,03:29:59.480,03:33:34.320,03:36:19.440,03:39:48.240,03:43:22.120,03:45:22.920,03:49:14.040,03:51:28.960,03:56:29.000,03:59:31.600,04:02:28.640,04:06:27.440,04:08:54.600,04:12:31.360,04:16:06.480,04:18:44.120,04:21:20.120,04:24:51.960,04:28:26.960,04:32:04.680,04:35:20.160,04:38:16.680,04:42:02.880,04:46:21.760,04:51:47.040,04:56:57.760,05:00:32.280,05:03:39.920,05:07:47.120,05:13:17.040,05:15:30.920,05:20:43.200,05:23:08.520,05:26:47.120,05:29:38.320,05:33:16.760,05:37:26.880,05:39:30.480,05:42:18.240,05:46:08.560,
Selected DVD audio channel: 0 language: ru
Cache fill:  0.10% (2048 bytes)   


Exiting... (End of file)
ID_EXIT=EOF
+ sleep 3
+ read line

DVD Файл соответственно не проигрывается и мало того - цикл почему то прерывается. Чета мозг закипает.

bearpuh ()
Ответ на: комментарий от bearpuh

Заметил, что при выполнении не рабочего скрипта при запуске mplayer на секунду появляется сразу 2 окна с видео. Теперь бы понять почему.

bearpuh ()
Ответ на: комментарий от bearpuh

В общем скорее всего проблема в конструкции while read или в самом read. Походу mplayer в такой конструкции запускается как демон (ппц просто) и система не ждет его завершения и цикл продолжается, при этом пытается запустить еще одну копию mplayer. Не понимаю как это возможно.
Решил пойти другим путем и написал тоже на perl. Все работает как и должно.

#!/usr/bin/perl

open (list, "playlist") || die;

while ($line=<list>) {
system ("/usr/sbin/karaoke $line");
}

close (list);
exit (0);

Просто такая конструкция позволяет менять файл playlist не прерывая скрипт (например добавлять новые песни в список). Хочу например с планшета или iPhone не прерывая воспроизведение по ssh законектиться к ноуту и добавлять новые песни в список, так же можно регулировать громкость через alsamixer.

bearpuh ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.