2003年11月17日

「図解表現」の技術が身につく本

 

★★★【「図解表現」の技術が身につく本 竹内元一著 PHP文庫】

* 2003/10に単行本で出たばかりの本。実は、図解関連の良い本はないかとずっと探していたのだが、立ち読みしても良い物は見つけきれていなかった。
* 今回、この本をたまたま書店で見かけて、パラパラとめくった程度で買ったのだが、過去に立ち読みしたどの本よりもコストパフォーマンスが高い。あたり前のことばかり書いているようだけど、実はノウハウが結構入っていると感じた。
* サブタイトルに「すぐに使えるビジュアル資料作成のノウハウ満載」と書いているようにパクれるネタがいっぱいあります。
* 495円であり、買っても損はしないと思う。 2003-11-17 (月) 19:01:32 (柴田ひ)

2003年11月10日

TV record with iEPG on Linux box

  新規作成 Ver.0.1 shibata@luky.org 2003-11-10 01:14:27

概要

インターネットTVガイドテレビ王国で利用可能な iEPGを利用したテレビ予約の仕組みです。
出来るだけ簡単な実装を心がけています。

基本的な構成

Server boxの構成

  • CPU: Pentium 2.4C GHz (オーバスペックかなぁ)
  • MEM: 1GB (これも、充分すぎるけど)
  • HDD: 120GB x 2 (ディスクはいくらあっても足りない...)
  • Video Capture card: SAA7134 card (ちょっとでも画質を良くと言う考えから...)
  • Sound card: Intel on-board
  • OS: Debian GNU/Linux sid
  • Sound subsystem: alsa
  • Video subsystem: ffmpeg
  • その他の要件:
    • インターネットからメールが送受信できること
    • atコマンド

Client boxの構成

  • OS: Debian GNU/Linux sid
  • Web Browser: galeon
  • その他の要件:
    • インターネットへメールが送信できること

基本的な動作の流れ

  • Linuxで動作させているクライアントPC上のWebブラウザでiEPGのリンクをクリックする。
  • その、クリックでダウンロードされるiEPGのデータをクライアントPCからサーバPCにメールで送信する。
  • サーバPCでは、受け取ったメールをスクリプトに食わせる。
  • そのスクリプトで、atコマンドでffmpegを用いた録画スクリプトの起動指定をおこなう。

今回の実装

Client side

クライアント側は、WebブラウザでiEPG情報をダウンロードする。
例えば、インターネットTVガイドでは 番組表の[iEPG]のマークをクリックすることで、
下記のようなデータがダウンロード出来る。

 Content-type: application/x-tv-program-info; charset=shift_jis
 version: 1
 station: TVQ
 year: 2003
 month: 11
 date: 09
 start: 05:00
 end: 06:00
 program-title: 演歌◇健康

上記のデータにより、(一部の情報を補ってあげれば)録画予約設定に
必要な情報が得られることが分かる。
あとは、この情報を自動的にサーバ側に登録する仕組みを作れば良い。

よって、クライアントサイドで、上記のmime情報を自動的に
処理するスクリプトをブラウザ側に登録する。
下記のスクリプトは/usr/local/bin/iepg.shとして置いておく。

 #!/bin/sh
 #    iepg.sh  2003.11.09 Hisaaki Shibata<shibata@luky.org>
 #
 nkf -e $1 |mail -s iEPG icommand@server.uriuri.com

いかにも「そのまんま」なスクリプトである(^^;

Subject:やメールの送信先は、適宜変更する必要がある。

次に、 Content-type: application/x-tv-program-infoのデータをダウンロードするときに
このスクリプトが自動的に起動するようにする必要がある。
galeonの場合は、~/.galeon/mimeTypes.xmlに

 <mimeitem name="application/x-tv-program-info" action="2" helper="/usr/local/bin/iepg.sh" helperNeedsTerminal="0" helperTakesUrl="0" alwaysUse="1"/>

などと記述すれば良い。

mailの送信先を自分のアドレスにしてみて、テストをすると良いでしょう。
尚、上記を見て気づかれたと思うが、iEPGのフォーマットさえ守れば、
人間がメールを送っても同じ事が出来る。
同じチャネルで連続して録画したいときなどは、独自にメールを作成して
送ればいいでしょう。

Server side

サーバ側は、クライアント側から送信されたメールを処理して、
しかるべき時刻に録画コマンドを起動する処理をおこなう必要がある。

/etc/aliasesに下記のような記述を追加し、root権限でnewaliasコマンドを実行する。

 icommand: "|/usr/local/bin/icommand.sh"

つまり、icommand@server.uriuri.com宛のメールが届くと、
そのメールの内容をicommand.shの標準入力に流し込んで起動すると言う設定である。

/usr/local/bin/icommand.shの内容を下記に示す。

 #!/bin/sh
 #    icommand.sh  2003.11.09 Hisaaki Shibata<shibata@luky.org>
 #
 
 nkf -e $1 |sed 's/:/ /g'|awk '
 /station  KBC/		{channel=1;bc="KBC";}
 /station  NHK総合/	{channel=3;bc="NHK";}
 /station  RKB/		{channel=4;bc="RKB";}
 /station  NHK教育/	{channel=6;bc="NHKedu";}
 /station  TNC/		{channel=9;bc="TNC";}
 /station  TVQ/		{channel=19;bc="TVQ";}
 /station  FBS/		{channel=37;bc="FBS";}
 /year /			{year=$2;}
 /month /		{month=$2;}
 /date /			{date=$2;}
 /start /		{startH=$2;startM=$3;}
 /end /			{endH=$2;endM=$3;}
 
 END	{if (endH >= startH) {
 	   len = (endH * 60 + endM - startH * 60 - startM) * 60 - 10;
 	 }else {
 	   len = ((24 + endH) * 60 + endM - startH * 60 - startM) * 60 - 10;
 	 }
 	printf("echo /usr/local/bin/va1000cap.sh %d %d \
 	/var/tmp/%s-%4d-%02d-%02d_%02d%02d\ > \
 	/tmp/%4d-%02d-%02d_%02d%02d.shn\
 	at -f /tmp/%4d-%02d-%02d_%02d%02d.sh\
        %02d%02d %4d-%02d-%02d\n,\
 	channel,len,\
 	bc,year,month,date,startH,startM,\
 	year,month,date,startH,startM,\
 	year,month,date,startH,startM,\
 	startH,startM,year,month,date);
       }
 '|sh

上記のスクリプトは、

  • /tmpにYear-Month-Date-HourMinute?.shというshell scriptを作成し、
  • そのscriptの中で/usr/local/bin/va1000cap.sh channel len outputfile.aviを指定している。
  • その後、atコマンドで/tmp上のスクリプトの定時起動を指定している。

この例は、福岡市の場合であり、テレビ局名とチェンネル番号は、
各地域毎に作り直す必要がある。

それにしても、こてこての泥臭さである(^^;

さて、上記スクリプトでさらに起動されているva1000cap.shの内容を下記に示す。

 #! /bin/sh
 # va1000cap.shby Hisaaki Shibata <shibata@luky.org>.
 
 NAME=va1000cap.sh
 DATE=`date +%Y%m%d%H%M`
 /usr/sbin/alsactl -f /home/shibata/asound.state restore
 
 /usr/bin/v4lctl setchannel $1
 
 /usr/bin/ffmpeg -f avi -vcodec msmpeg4v2 -hq -acodec mp3 -y -b 1200 -ab 128 -r 30 -s 384x288 -cropbottom 6 -cropleft 4 -cropright 4 -ar 22050 -ac 2 -t $2 $3-c$1-$DATE.avi
 
 exit 0


出力AVIファイル名の指定などに冗長なところがあるが、指定した時刻と、
実際に動作した時刻を比較するためのものであり、必要に応じていじっていただきたい。

また、この程度のスクリプトであれば、別途作成せず、
直接icommand.shで記載しても良いと思う。

SA7134のボードでのキャプチャの設定やffmpegに関しては、おいおい追記する。
Last modified: Mon Nov 10 02:55:12 JST 2003