понедельник, 28 апреля 2014 г.

Просмотр телевидения в ОС linux

При просмотре телепередач с тв-тюнера в линуксе возникли некоторые сложности: с самого начала (из "коробки") тюнер работал только в композитном режиме (то есть только с видеовхода), решение этой проблемы нашлось в размещении в /lib/firmware микропрошивки xc3028-v27.fw (можно найти в интернете и скачать) это для карты PixelView MPEG8000GT, для вашей может понадобиться другая, узнать можно изучив вывод команды dmesg | grep cx ища строку "not found".

UPD: Да и не забыть занести в /etc/modprobe.d/cx88.conf (файл .conf  может и называться по другому, обязателен только "суффикс", (или расширение имени).
options cx88xx card=66 tuner=71
options snd-hda-intel index=0
options cx88_alsa index=1

Где номер card берётся из списка поддерживаемого оборудвания CARDLIST.cx88, в документации по linux  Раньше можно было было узнать это при загрузке ядра, командой dmesg | grep cx88, но теперь убрали перечисление "железа", из всех, даже старых linux. Откуда берётся параметр tuner - я так и не понял: свой я нагуглил в интернете.

Многие ставят для просмотра телевидения программу tvtime и не все знают, что для просмотра телепередач в системе уже все для этого есть Для всех, кто не знает что и mplayer и mpv (бывший mplayer2)  тоже могут показывать телевизор:


mplayer -tv driver=v4l2: device=/dev/video0: normid=4: chanlist=russia: channel=13: alsa=1: adevice=hw.1: audiorate=48000: amode=1 tv://R-2
где normid и norm (числовое и символьное представление) обозначает систему цветности, и могут принимать такие значение:
 supported norms: 0=NTSC-M; 1=NTSC-M-JP; 2=NTSC-443; 3=PAL-BG; 4=PAL-I; 5=PAL-DK; 6=PAL-M; 7=PAL-N; 8=PAL-Nc; 9=PAL-60; 10=SECAM-B; 11=SECAM-G; 12=SECAM-H; 13=SECAM-DK; 14 = SECAM-L;
R-2 - Второй метровый телеканал, он же опция -tv freq=59,25 (mHz), chanlist - национальная таблица телевизионных радиочастот, у нас russian, но может принимать значения: europe-east, europe-west, us-bcast,  us-cable и другие. amode - режим звука:

ВНИМАНИЕ ! Крайне не рекомендуется использовать опцию immediatemode=0 - она дает звук при проблемах со звуком ( о чем будет разговор ниже) но сильно тормозит и рассинхронизирует звук и видео.

Но для того, чтобы не мучаться каждый раз переключая каналы R1,R2,R3,R4 (клавишами J - вперед,K - назад) можно заранее просканировать имеющиеся у вас телеканалы, разумеется с национальными стандартами вещания:

mplayer -tvscan autostart -tv driver=v4l2:device=/dev/video0: normid=13: chanlist=russia: channel=13: alsa=1: adevice=hw.1: audiorate=48000:amode=1 tv://
и такая же команда в mpv:
 mpv -tv-scan-autostart --tv=driver=v4l2:device=/dev/video0:normid=13 chanlist=russia:channel=13:alsa=1:adevice=hw.1:audiorate=48000:amode=1 tv:// 
 Получившуюся таблицу, в моём случае социального пакета коллективной антенны:
TV scan end. Found 50 new channels.
channels=2-ch1,4-ch2, SK1-ch3, SK2-ch4, SK3-ch5, SK4-ch6, SK5-ch7,SK6-ch8,SK7-ch9,6-ch10,7-ch11,9-ch12,10-ch13,12-ch14, SK11-ch15, SK12-ch16, SK13-ch17, SK14-ch18, 21-ch19, 24-ch20, 26-ch21, 28-ch22, 30-ch23, 32-ch24, 34-ch25, 36-ch26, 37-ch27, 39-ch28, 40-ch29, 41-ch30, 42-ch31, 43-ch32, 45-ch33, 47-ch34, 50-ch35, 52-ch36, 53-ch37, 54-ch38, 55-ch39, 56-ch40, 58-ch41, 59-ch42, 61-ch43, 62-ch44, 63-ch45, 64-ch46, 66-ch47, 67-ch48, 68-ch49,69-ch50
 Заношу в файл конфигурации .mplayer/config, после чего тот приобретает такой вид:

$ cat .mplayer/config
# Write your default config options here!

vo=gl
tv=driver=v4l2:normid=13:chanlist=russia:channels=2-ch1,4-ch2,SK1-ch3,SK2-ch4,SK3-ch5,SK4-ch6,SK5-ch7,SK6-ch8,SK7-ch9,6-ch10,7-ch11,9-ch12,10-ch13,12-ch14,SK11-ch15,SK12-ch16,SK13-ch17,SK14-ch18,21-ch19,22-ch20,24-ch21,26-ch22,28-ch23,30-ch24,32-ch25,34-ch26,36-ch27,37-ch28,39-ch29,40-ch30,41-ch31,42-ch32,43-ch33,45-ch34,47-ch35,50-ch36,52-ch37,53-ch38,54-ch39,55-ch40,56-ch41,58-ch42,59-ch43,61-ch44,62-ch45,63-ch46,64-ch47,66-ch48,67-ch49,68-ch50,69-ch51 subcp=cp1251
subcp - это кодировка субтитров на видео, большинство из которых именно в cp1251. В channels можно задавать не только название канала но и его стандарт, если, к примеру, кто-то вещает в PAL то можно установить эту систему через знак равенства для этого одного, отдельно взятого канала

У mpv config все-же немного отличается, но интуитивно понятно:
$ cat .mpv/config
tv-driver=v4l2
tv-normid=13
tv-chanlist=russia
tv-channels=2-ch1,4-ch2,SK1-ch3,SK2-ch4,SK3-ch5,SK4-ch6,SK5-ch7,SK6-ch8,SK7-ch9,6-ch10,7-ch11,9-ch12,10-ch13,12-ch14,SK11-ch15,SK12-ch16,SK13-ch17,SK14-ch18,21-ch19,22-ch20,24-ch21,26-ch22,28-ch23,30-ch24,32-ch25,34-ch26,36-ch27,37-ch28,39-ch29,40-ch30,41-ch31,42-ch32,43-ch33,45-ch34,47-ch35,50-ch36,52-ch37,53-ch38,54-ch39,55-ch40,56-ch41,58-ch42,59-ch43,61-ch44,62-ch45,63-ch46,64-ch47,66-ch48,67-ch49,68-ch50,69-ch51
Все опции в mpv можно узнать через ключ --list-options

Ну вот, картинка есть, показывает, но, по-прежнему нет звука.  Но это, видимо, недоработка драйверов для отдельно взятой моей железки, говорят, что таких проблем всё меньше (не купить ли мне новый тв-тюнер ?) Даже уже присмотрел себе KWORLD PC134-A - у hardware этой фирмы совсем нет проблем при работе с линуксом.

Но для тех, у кого такие проблемы всё-же есть можно порекомендовать следующий "костыль", даже два, вот скрипты которые я размещаю у себя на рабочем столе, чтобы смотреть телек:

Первый использует sox:

#!/bin/bash
((sox -r 32000 -t alsa hw:1,0 -t alsa hw:0,0 &) && mpv tv:// )&&killall sox
Ну, тут нечего разъяснять, второй использует arecord:

#!/bin/bash
mpv tv:// | arecord -D hw:1,0 -r 32000 -c 2 -f S16_LE | aplay -q -
killall  arecord
И чужой вариант скрипта (интересен подключением sox к микшеру), найденый здесь:

 #!/bin/sh
sox -c 2 -s -w -r 32000 -t ossdsp /dev/dsp1 -t ossdsp -w -r 32000 /dev/dsp &
tvtime --mixer=/dev/mixer:pcm
wait tvtime
t=`pidof sox`;
kill $t;
amixer -c 0 sset PCM 80%,80% unmute


Здесь тоже нечего, только стоит напомнить что mpv - это бывший mplayer2, в свою очередь имеет корни от mplayer, а tvtime - это "смотрелка" тв, вобщем-то,  не нужная при наличии первых двух. Только нужно запустить oss, с этим в арчлинуксе проблемы...

UPD: Еще один вариант скрипта, хорош тем, что звук микшируется с другими источниками:
#!/bin/sh
if [ -f /usr/bin/arecord ]; then
arecord -q -D hw:1,0 -r 32000 -c 2 -f S16_LE | aplay -q - &
fi
if [ -f /usr/bin/mpv ]; then
mpv tv://
fi
pid=`pidof arecord`
if [ $pid ]; then
kill -9 $pid
fi
Отсюда


Самое интересное, что при записи эфира в видеофайл такие костыли не нужны:
mencoder -ovc copy -oac copy -noskip -tv driver=v4l2:normid=13:chanlist=russia:device=/dev/video0:adevice=hw.1,0:amode=1:alsa:forceaudio tv://R-2 -o ~/file.mpg

Вот, пожалуй, и все, что хотел сказать про тв-тюнер в линуксе, и что хотел бы напоминалкой напомнить и себе самому :)

UPD:  Запись с тюнера со сжатием:
mencoder tv:// -tv driver=v4l2:width=640:height=480:normid=13:alsa:adevice=hw.1,0:forceaudio -o запись_с_тюнера_за-$(date +%d-%m-%Y-%H-%A-%H:%M:%S).avi -ovc lavc -lavcopts vcodec=mpeg4: aspect=4/3 -vf pp=lb -oac mp3lame -lameopts cbr:preset=128:mode=1 -mc 0 -noskip
Соответственно конфиг ,mplayer/mencoder.conf таков:
ovc=xvid=1
xvidencopts=vhq=4:me_quality=6:chroma_opt=1:fixed_quant=8
oac=mp3lame=1
lameopts=aq=1:cbr=1:br=160

[best]
ovc=xvid=1
xvidencopts=vhq=4:bvhq=1:max_bframes=3:trellis=1:qpel=1:gmc=1:chroma_opt=1: quant_type=mpeg
oac=mp3lame=1
lameopts=aq=1:cbr=1:br=192

[1600]
# Encoding 1080p material
ovc=xvid=1
vf=pp=l5,crop=1920:1056
xvidencopts=vhq=4: bvhq=1:nogmc=1:me_quality=6:chroma_me=1:chroma_opt=1:min_iquant=1:min_pquant=1: fixed_quant=5
oac=mp3lame=1
lameopts=aq=1:cbr=1:br=256
UPD:  Немножко изменил скрипты
 #!/bin/bash
tvsrv=$( ps aux | sed -n '/tv:\/\//p' | awk '{ print $2 }' )
if [ $( ps aux | grep sox ) ]; then killall aux ; fi
if [ $( ps aux | grep arecord ) ]; then killall arecord ; fi
if [ $tvsrv  ]; then kill $tvsrv ; fi
((sox -t alsa hw:1,0 -t alsa hw:0,0 &) && mpv tv:// )&&killall sox

И для записи с большим битрейтом:
#!/bin/bash
killall `lsof /dev/video0 | sed '/COMMAND/d' | awk '{ print $1 }'`
killall `lsof /dev/snd/pcmC1D0c | grep pcm | awk '{ print $1 }'`
mencoder tv:// -tv driver=v4l2:width=640:height=480:normid=13:alsa:adevice=hw.1,0:forceaudio -o запись_с_тюнера_за-$(date +%d-%m-%Y-%H-%A-%H:%M:%S).avi -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=1800:mbd=2:trell:aspect=4/3 -vf pp=lb/v1/h1/d -oac mp3lame -lameopts cbr:preset=128:mode=1 -mc 0 -noskip

Ссылки по теме на блоге:
http://mynotescomp.blogspot.com/2014/07/mencoder.html

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.