Raspberry Pi 4 ã§æ§ç¯ããé²ç»ãã·ã³
ð Raspberry Pi 4 ãè²·ããããã«ãªãã¾ãã
2019å¹´11æãå¾ æã® Raspberry Pi 4 æé©åå¾çãçºå£²ããã¾ãããH.264 ãã¼ãã¦ã§ã¢ã¨ã³ã³ã¼ããæè¼ããããªãããªã·ã³ã°ã«ãã¼ãã³ã³ãã¥ã¼ã¿ã§ãã2020å¹´5æ28æ¥ã«ã¯ 8GB ã¡ã¢ãªæè¼ã®ä¸ä½ã¢ãã«ãç»å ´ãã¦ãã¾ãã
ã¯ããã¦ããã¯ä½ãããããã®ããã¤ã¹ãªã®ã§ããããï¼
ããã§ããé²ç»ã§ããããããã¬ãã®é²ç»ãããããã«é«ä¾¡ãªãã½ã³ã³ãè³¼å ¥ããå¿ è¦ã¯ããã¾ããã5000åå°ããå ¥æã§ãããã·ã³ãå©ç¨ãã¦ãå®ä¾¡ã«é²ç»ãµã¼ãã¼ãæ§ç¯ãããã¨ãã§ããããã«ãªã£ãã®ã§ãã
ãã®è¨äºã§ã¯ Raspbery Pi 4 ãå©ç¨ãã Mirakurun + EPGStation ã§ã®é²ç»ãµã¼ãã¼æ§ç¯æ¹æ³ã¨ããã¼ãã¦ã§ã¢ã¨ã³ã³ã¼ããå©ç¨ããé²ç»ãã¡ã¤ã«ã®ã¨ã³ã³ã¼ãã«ã¤ãã¦è§£èª¬ãè¡ãã¾ãã
Raspberry Pi ã®â¼â¼¿
Raspberry Pi 4 ã¯ä¸é¨ã®å°åï¼ä¸»ã«ç§èåï¼åºé ããã¤ã³ã¿ã¼ãããã§æã«å
¥ãããã¨ãã§ãã¾ããæ¨æºç㪠4GB ã¢ãã«ã®æ«ç«¯ä¾¡æ ¼ã¯ 7000 åã»ã©ã
æä½éãã½ã³ã³ã¨ãã¦åä½ãããããã«ã¯ãæ¬ä½ã®ä»ã«é»æºã¨ SD ã«ã¼ããå¿
è¦ã§ãã
ãã¼ãã·ã³ã¯ãæ¾ç±ç¨ã®ãã¡ã³ãå°ç¨ã±ã¼ã¹ã®è³¼å ¥ãããã¨ããã§ããããåºæ¿ããåºãã®ã¾ã¾éã«æ±ãã¨ç°¡åã«å£ãã¦ãã¾ãã¾ããç§ã¯éå±ã«ã·ã§ã¼ãããããæ°´ãããããªã©ãã¦ä½å°ãã´ãã«ãããã¨ãããã¾ãã
ããã¦éè¦ãªã®ãé»æºã§ãããããä¸å®å®ã ã¨çªç¶è½ã¡ã¦ãã¾ããã¨ãããã¾ããåé¡ãªã 3A ãåããã¨ãã§ãããå°ç¨ã®é»æºãé¸ã¶ã¨è¯ãã§ãããã
é²ç»ãã·ã³ç¨ãã¼ãã®å ¥æ
ã³ã³ãã¥ã¼ã¿ãé²ç»ãã·ã³åããããã«ã¯ä»¥ä¸ã®ãã¼ããå¿ è¦ã§ãã
- IC ã«ã¼ããªã¼ãã¼
- B-CAS ã«ã¼ã
- TV ãã¥ã¼ãã¼
- ã¹ãã¬ã¼ã¸ï¼HDD/SSD/NAS ãªã©ï¼
ä»åIC ã«ã¼ããªã¼ãã¼ã¯ Gemalto IDBridge CT30ãTV ãã¥ã¼ãã¼ã¯ PLEX PX-S1UD V2.0 ã§åä½ã確èªãã¾ãããã©ã¡ãã Amazon ã§è³¼å ¥ã§ãã¾ãã
çè ã¯é·å¹´TVãã¥ã¼ãã¼ã¨ã㦠PT3 ã使ã£ã¦ãããPCI Express ã¹ãããã®ãªã Raspberry Pi ã§ãã¥ã¼ãã¼ãåããã¨ããçºæ³ãããã¾ããã§ãããããããç¾å¨ã¯ 1ch é²ç»å¯è½ãª USB ãã³ã°ã«ã5000åç¨åº¦ã§å ¥æãããã¨ãã§ãã¾ãããããè¤æ°åç¹ãã°ããã®åã ããã£ã³ãã«ã®è¿½å ãå¯è½ã§ãã4ch åæé²ç»ãã§ãã PLEX PX-Q1UD ã§ãåä½ããããã§ãã
Raspberry Pi ã® SD ã«ã¼ãã§ã¯ããã«é²ç»ãã¼ã¿ãåã¾ã£ã¦ãã¾ãã¾ãã®ã§ãå¤ä»ãã® HDD ã NAS ã追å ã§å¿ è¦ã§ãããã©ã®ã¹ãã¬ã¼ã¸ã使ããã«ã¤ãã¦ã¯ãåèªã®ã³ã¹ãæã¨ç¸è«ã§ããç§ã¯ç¾å¨ããã ã®USBæ¥ç¶ãã¼ããã£ã¹ã¯ãå©ç¨ãã¦ãã¾ãã
ä¾¡æ ¼ã®ãã¬ã大ããã¹ãã¬ã¼ã¸ãé¤ãã¨ããããã¯åè¨1ä¸6000åã»ã©ã§è²·ãéãããã¨ãã§ãã¾ãããB-CAS ã«ã¼ãã®èª¿éæ¹æ³ã¯è¬ã§ãã
ð Raspberry Pi ã®ã»ããã¢ãã
OS 㯠Raspberry Pi OS ã使ã£ã¦è§£èª¬ãã¾ããRaspberry Pi åãã® OS 㯠Raspbian ã¨ããååã§ãããã2020å¹´5æã«æ£å¼å称ãå¤ããã¾ãããå ¬å¼ã®ã¤ã¡ã¼ã¸æ¸ãè¾¼ã¿ãã¼ã« Raspberry Pi Imager ã使ã£ã¦ãç°¡åã«ã¤ã³ã¹ãã¼ã«ãããã¨ãã§ãã¾ãã
IC ã«ã¼ããªã¼ãã¼ã®ã»ããã¢ãã
IC ã«ã¼ããªã¼ãã¼ãæ±ããã¼ã«ã¯ä»¥ä¸ã®ã³ãã³ãã§ã¤ã³ã¹ãã¼ã«ã§ãã¾ãã
$ sudo apt update
$ sudo apt install pcscd libpcsclite-dev libccid pcsc-tools
pcsc-tools ã«å«ã¾ãã¦ãã pcsc_scan ã¨ããã³ãã³ãã§ãIC ã«ã¼ãã®æ¥ç¶ã確èªãããã¨ãã§ãã¾ãã
$ pcsc_scan | grep B-CAS
â¡ Japanese Chijou Digital B-CAS Card (pay TV)
ã¨ãã表示ã確èªã§ããã°æåã§ãã
ãã¥ã¼ãã¼ã®ã»ããã¢ãã
ä»åå°ã㸠TV ãã¥ã¼ãã¼ã¨ã㦠PLEX PX-S1UD ãå©ç¨ãã¾ãããã©ã¤ãã¯ãã¬ã¯ã¹ã®ãµã¤ããããã¦ã³ãã¼ãã§ãã¾ãã
$ wget http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zip
$ unzip PX-S1UD_driver_Ver.1.0.1.zip
$ sudo cp PX-S1UD_driver_Ver.1.0.1/x64/amd64/isdbt_rio.inp /lib/firmware/
usb-devices
ã³ãã³ã㧠PX-S1UD ãèªèããã¦ãããã¨ã確èªãã¾ãã
$ usb-devices | grep PX-S1UD
â¡ Product=PX-S1UD Digital TV Tuner
ã¨ãããã®ã表示ãããã°ã¤ã³ã¹ãã¼ã«å®äºã§ãã
2020å¹´7æ6æ¥ ç·¨éè 注: ä¸è¨ã®ã³ãã³ãã§
adapterâ¦
ãåºã¦ããã°æ£å¸¸ã« DVB ããã¤ã¹ã¨ãã¦èªèããã¦ãã¾ãã
$ ls -l /dev/dvb/
DVB ãã©ã¤ãã®ã¤ã³ã¹ãã¼ã«
2020å¹´7æ4æ¥ è¿½è¨: ãã®è¨äºã®å稿ã§ã¯ recdvb ã³ãã³ãã§ã®å©ç¨ãç´¹ä»ãã¦ãã¾ããããPX-S1UD 㯠Linux æ¨æºã® DVB API ã使ãã¾ããapt ãå©ç¨ãã¦ãdvb-tools ãã¤ã³ã¹ãã¼ã«ãã¾ãã
$ sudo apt install dvb-tools
ð ãã¼ãã¦ã§ã¢ã¨ã³ã³ã¼ããè¡ã
çã® MPEG2-TS åç»ãä¿åãç¶ããè¡çºã¯ã¹ãã¬ã¼ã¸ã帯åãªã½ã¼ã¹ã¸ã®è² è·ãé«ãã§ãããªãã¹ãã¨ã³ã³ã¼ããã¦ã¨ã³ã«é²ç»çæ´»ãè¡ããããã®ã§ãã
Raspberry Pi 4 ã«ã¯ H.264 ã®ãã¼ãã¦ã§ã¢ã¨ã³ã³ã¼ããæè¼ããã¦ãããCPU ã¸ã®è² è·ãæããé«éãªã¨ã³ã³ã¼ããè¡ããã¨ãã§ãã¾ãã
使ç¨æ¹æ³ãé£ããããã§ã¯ãªããåç»å¤æãã¼ã«ã®ããã¡ã¯ãã¹ã¿ã³ãã¼ãã§ãã FFmpeg ã®ãã¼ãã¦ã§ã¢ã¨ã³ã³ã¼ã対å¿çã apt ãããã®ã¾ã¾å
¥æãããã¨ãã§ãã¾ãã
$ sudp apt update
$ sudo apt install ffmpeg
Raspberry Pi ã®ãã¼ãã¦ã§ã¢ã¢ã¯ã»ã©ã¬ã¼ã·ã§ã³ãå©ç¨ããã¨ã³ã³ã¼ãã¯ãh264_omx
ãã¨ããååã§ããomx ã¨ããã®ã¯çµã¿è¾¼ã¿æ©å¨åããã«ãã¡ãã£ã¢ API ã§ãã OpenMAX ã®ç¥ç§°ã§ããã
ffmpeg -codecs
ã³ãã³ãã§å¯¾å¿ãã¦ããã³ã¼ããã¯ã確èªãããã¨ãã§ãã¾ããH.264 ã¨æ¸ããã¦ããè¡ã®å©ç¨ã§ããã¨ã³ã³ã¼ãæ¬ã«ããã®æ§åã確èªã§ããã¨æãã¾ãã
$ ffmpeg -codecs
ä¾ã¨ã㦠sample.m2ts ã¨ããçã® TS ãã¡ã¤ã«ãããå ´åã以ä¸ã®ã³ãã³ãã§ãã¼ãã¦ã§ã¢ã¨ã³ã³ã¼ããå©ç¨ãã mp4 ã¸ã®å¤æãè¡ããã¨ãã§ãã¾ãã
$ ffmpeg -i sample.m2ts -codec:v h264_omx -b:v 3000k sample.mp4
ãªãã¨ãªãèªããã¨æãã¾ããã-codec:v h264_omx
ãæå®ãããã¨ã§ãã¼ãã¦ã§ã¢ã¨ã³ã³ã¼ããå©ç¨ã㦠H.264 ã¸ã®å¤æãè¡ãã¾ãã
ããã©ã«ãã§ã¯å§ç¸®çãé«ãç»è³ªãæªãããããã -b:v
ã§æ åãããã¬ã¼ãã 3000kb/s ã« æå®ãã¦ç»è³ª(ã¨ãã¡ã¤ã«ãµã¤ãº)ãä¸ãã¦ãã¾ãã
18MB ã»ã©ãã£ã m2ts ã 3.5MB ã»ã©ã® mp4 ã¨ãªãã¾ããããVLC ã¡ãã£ã¢ãã¬ã¼ã¤ã¼ãªã©ã§åé¡ãªãåçãããã¨ãã§ããã§ãããã
å¤æé度ã¯æ¥µãã¦å®ç¨çã§ãããããã 1.42 åéã§å¤æãããã¨ãã§ãã¾ããã試ãã«ãã¼ãã¦ã§ã¢ã¨ã³ã³ã¼ãã使ããªã h264 ã使ã£ã¦ã¿ãã¨ã 0.295 åéããã§ã¾ããã使ããªãããªãã¹ãã¼ãã§ã¯ããã¾ãããæéã¨é»æ°ä»£ã®ç¡é§é£ãæãããã¾ãããªã«ããCPU ããã«å転ãã¦ãã¾ãããããªã¢ã«ã¿ã¤ã è¦è´ãªã©ã®åä½ã«å½±é¿ãåºã¦ãã¾ãããããã¾ããã
[h264_omx @ 0x887230] Using OMX.broadcom.video_encode
Output #0, mp4, to 'sample.mp4':
Metadata:
encoder : Lavf58.20.100
Stream #0:0: Video: h264 (h264_omx) (avc1 / 0x31637661), yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], q=2-31, 3000 kb/s, 29.97 fps, 30k tbn, 29.97 tbc
Metadata:
encoder : Lavc58.35.100 h264_omx
Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s
Metadata:
encoder : Lavc58.35.100 aac
[mpegts @ 0x7931e0] PES packet size mismatchime=00:00:08.67 bitrate=2900.9kbits/s dup=17 drop=0 speed=1.42x
ð Mirakurun ã®ã»ããã¢ãã
ããªãã¿æ±ç¨ãã¸ã¿ã«ãã¥ã¼ãã¼ãµã¼ãã¼ã§ãã Mirakurun ã®ã¤ã³ã¹ãã¼ã«ã§ãã
Node.js ã®ã¤ã³ã¹ãã¼ã«
ããã¯å¥½ã¿ã«ãã£ã¦ã好ããªæ¹æ³ã§ãNode.js ãã¤ã³ã¹ãã¼ã«ããæ¹æ³ã¯ 100 éããããèãããã¾ãããããã±ã¼ã¸ããã¼ã¸ã£ã¼ãå©ç¨ããå ´åã¯ä»¥ä¸ã®ã³ãã³ãã§å®äºãã¾ãã
$ curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
$ sudo apt install nodejs
PM2 ã®ã¤ã³ã¹ãã¼ã«
ããã»ã¹ããã¼ã¸ã£ã§ãããµã¼ãã¼åèµ·åæã«ã¢ããªã±ã¼ã·ã§ã³ãèªåèµ·åãããããªããæ»ãã ãå©ãèµ·ããã¨ãã£ãä»äºããã¾ãã
$ sudo npm install pm2 -g
Mirakurun ã®ã¤ã³ã¹ãã¼ã«
$ sudo npm install mirakurun@latest -g --unsafe-perm --production
$ sudo npm install arib-b25-stream-test -g --unsafe-perm
mirakurn ã³ãã³ãã«ãããPM2 ãä»ãã Mirakurun ã®èµ·å/åæ¢ãè¡ããã¨ãåºæ¥ã¾ãã
$ sudo mirakurun start
以ä¸ã®ã³ãã³ãã§ãã£ã³ãã«ã®ã¹ãã£ã³ãè¡ããã¨ãã§ãã¾ãï¼èµ·åæã«èªåã§ã¹ãã£ã³ã¯ãããã¯ãã§ããï¼
$ sudo curl -X PUT "http://localhost:40772/api/config/channels/scan"
$ sudo mirakurun restart
ð EPGStation ã®ã»ããã¢ãã
é²ç»ç®¡çã½ããã¨ã㦠EPGStation ãå©ç¨ãã¾ããåç³»ã½ããã® Chinachu ã§ãå¿«é©ã«å©ç¨ãããã¨ã¯ã§ãã¾ãããä»åã¯ãã¼ãã¦ã§ã¢ã¨ã³ã³ã¼ããå©ç¨ããã¨ã³ã³ã¼ããè¡ããããããèªåã¨ã³ã³ã¼ãæ©è½ããµãã¼ãããã¦ãããã¡ããé¸æãã¾ããã
$ git clone https://github.com/l3tnun/EPGStation.git
$ cd EPGStation
$ sudo npm install
$ sudo npm run build
$ cp config/config.sample.json config/config.json
$ cp config/operatorLogConfig.sample.json config/operatorLogConfig.json
$ cp config/serviceLogConfig.sample.json config/serviceLogConfig.json
è¨å®ãã¡ã¤ã«ã®ç·¨éãvim ã VSCode Remote Development ãªã©å©ç¨ã㦠config/config.json
ãç·¨éãã¾ããffmpeg ã®ãã¹ã¨é²ç»ãããã¼ã¿ã®ä¿åå
ãå¤æ´ããã°ãåºæ¬çãªå©ç¨ãã§ããããã«ãªãã¾ããrecorded ã®ãã¹ã«é¢ãã¦ã¯ãèªåã§ãã¦ã³ããã HDD ã NAS ãªã©ãä¿åå
ã¨ãã¦æå®ããã¨ããã§ãããã
"ffmpeg": "/usr/bin/ffmpeg",
"ffprobe": "/usr/bin/ffprobe",
"recorded": "/path/to/recorded",
"recordedTmp": "/path/to/recordedTmp",
ä½è«ã§ããæè¿ã® VSCode Remote DevelopmentãRaspberry Pi ã§ä½¿ããããçµ±åã¿ã¼ããã«ã®çªã§ã³ãã³ããæã¡ãªããä½æ¥ã§ãã¦ä¾¿å©ã§ãã
ãã©ã¦ã¶ä¸ã§ã®ã©ã¤ãè¦è´ãå©ç¨ãã
EPGStation ã«ã¯ãã©ã¦ã¶ä¸ã§ã©ã¤ãè¦è´ãè¡ãæ©è½ãããã¾ããã©ã¤ãè¦è´ã®ãã©ã¼ãããã«é¢ãã¦ã¯ config.json
ããæå®ãããã¨ãã§ããããã©ã«ãã® config.json
ãã¡ã¤ã«ã§ã¯ M2TS / HLS / WebM / MP4 ãå©ç¨ã§ããããå®ç¾©ããã¦ãã¾ãã
ãã ã Raspberry Pi 4 ã®å¦çè½åã§ã¯ãããããã¾ã¨ãã«åãã¾ãããç¡å¤æã® M2TS ã®ã¿é
延ãªãåçãããã¨ãã§ãã¾ããããã©ã¦ã¶ä¸ã§ã®åçã¯ã§ããªããã VLC ã¡ãã£ã¢ãã¬ã¼ã¤ã¼ãªã©ãçµç±ãããã¨ã¨ãªãã¾ããããã¯ã¡ãã£ã¨ä¸ä¾¿ã§ãããããã»ã©ãã¼ãã¦ã§ã¢ã¢ã¯ã»ã©ã¬ã¼ã·ã§ã³ãå©ç¨ããã¨ã³ã³ã¼ãã§ã¯ 1.4 åéç¨åº¦ã®ç¨åº¦ã®æ§è½ãåºãã¦ãã¾ããã®ã§ãããã使ã£ã¦ã©ã¤ãè¦è´ã¨ã³ã³ã¼ããè¡ã£ã¦ã¿ã¾ãããã
config/config.json
ã® liveMP4 ã¨ããé
ç®ã«ã以ä¸ã®è¨å®ã追å ãã¾ãã
{
"liveMP4": [
{
"name": "h264_omx",
"cmd": "%FFMPEG% -dual_mono_mode main -re -i pipe:0 -sn -codec:a aac -ar 48000 -ac 2 -b:a 192k -codec:v h264_omx -b:v 3000k -movflags frag_keyframe+empty_moov+faststart+default_base_moof -y -f mp4 pipe:1"
}
]
}
èªãã¾ããããæ¥æ¬èªã«ç´ãã¨ããã¤ã㧠ffmpeg ã«åç»ãæµãè¾¼ã¿ãå¤éé³å£°æ¾éã§ã¯ã¡ã¤ã³ã®é³å£°ãåé¢ãã¦åå¹ãé¤å»ãå¤æé度㯠1 åéãä¿ã¡ã¤ã¤ãã¼ãã¦ã§ã¢ã¢ã¯ã»ã©ã¬ã¼ã·ã§ã³ãå©ç¨ã㦠H.264 ã«å¤æãé³å£°ã¯ AAC 2ch 48k 192kbpsãHTML5 ã® Video ã¿ã°ã§åçã§ããããããæãã«ãã¦ãè¿äºã¯ãã¯ããããã©ã¼ããã㯠mp4 ã§ãã¤ãã«æµããã¨ããã¨ãªãã¾ãã
ãã®ä»ã®ã¨ã³ã³ã¼ãè¨å®ãå¤æ´ãã
é²ç»æã®èªåã¨ã³ã³ã¼ãããããã¯é²ç»å¾ã®ã¨ã³ã³ã¼ãã§ã§ããã¼ãã¦ã§ã¢ã¢ã¯ã»ã©ã¬ã¼ã¿ã使ãããã«å¤æ´ãã¾ãããããããã®ã¨ã³ã³ã¼ãã«é¢ãã¦ã¯ EPGStation ãã£ã¬ã¯ããªå
ã® config/enc.js
ãå©ç¨ãããäºã¨ãªã£ã¦ããããããã®ãã¡ã¤ã«ãä¸é¨å¤æ´ãã¾ãã
14 è¡ç®ãããã® codec ã h264_omx
ã«å¤æ´
const codec = 'h264_omx';
40 è¡ç®ãããããã®ä»è¨å®ã®ç´åã«ãããã¬ã¼ãã®æå®ã追å ãã¾ãã
Array.prototype.push.apply(args, ['-b:v', '3000k']);
EPGStation ãèµ·åãã
ãã¡ãã Mirakurun ã¨åãã PM2 ãå©ç¨ãã¦ããã»ã¹ã®ç®¡çãè¡ãã¾ãããã
npm run build
pm2 start dist/server/index.js -name "epgstation"
pm2 monit ã³ãã³ãã§ããã»ã¹ãèµ·åãããæ§åã確èªãããã¨ãã§ãã¾ãã
以ä¸ã«ãããåã LAN å ã®ãã½ã³ã³ãã http://raspberrypi.local:8888/ ã«ã¢ã¯ã»ã¹ãã¦ãã¬ããè¦è´/é²ç»ãããã¨ãã§ããããã«ãªãã¾ããããã®ã¢ãã¬ã¹ãéããªãå ´åã¯ãraspberrypi.localãã®é¨åã Raspberry Pi ã® IP ã¢ãã¬ã¹ã«å¤æ´ãã¦ãã ããã
â¦ãã¨ãã
ç¹ã«è¦ãããã§ããªããã¬ãã®ãã½ã³ã³é²ç»æ´»åãç¶ãã¦10年以ä¸ã®ææ¥ãçµã¡ã¾ãããé²ç»ãåãå·»ãç°å¢ã¯æ¥ã é²åãç¶ãã¦ãã¾ããæå¤ã¨é²ç»ãä¸è¦ã«ãªãæ¥ã¯æ¥ã¾ãããã¨è¨ãã¤ã¤å¥ã«è¦ã¦ããªãã®ã§ããã°æåããä¸è¦ã ã£ãæ°ããã¾ããã¨ãããã¨ã¯ãä»å¾ããã£ã¦ãããã¨ã«ãªãã®ã ã¨æãã¾ãããããããé¡ããã¾ãã
Writer: kkosuge
Editor: kanreisa / Yuki K.
Publication: 空æ°é²å¦é»åç (C98v)