ubuntu/TV録画/OldSettings

TV録画の古い設定

Mythtvのインストール

  • パッケージのインストール
    $ sudo apt-get update
    $ sudo apt-get install mythtv mythtv-themes
    • パスワードの変更
      パッケージのインストール途中でパスワードを変更するなら云々というメッセージがでるので,インストール後の以下のコマンドでパスワードを変更する.

      $ sudo dpkg-reconfigure mythtv-common
    • mysqlの設定変更
      /etc/mysql/my.cnfを編集して,以下のbind-addressの行をコメントアウトする.

      #bind-address           = 127.0.0.1

      mysqlを再起動する.

      # /etc/init.d/mysql restart
  • xmltvの設定
    • xmltvのインストール
      $ sudo apt-get install libtext-kakasi-perl xmltv
    • ビデオソースの設定
      $ tv_grab_jp --configure

      TV局は地域を選択してから,各局の追加の有無を選択する.
      CSは地域でCATV(47)を選択し,4桁に1000と入力しそこから地道にYes/Noを選択していく.

  • mythtvバックエンドの設定
    オモイノホカ日々徒然を参考に設定していく
    ビデオソース設定でうまくDBに接続ができないようなので,DBの権限を再設定する.

    $ mysql -u root -p
    password:<パスワードを入力>
    mysql> grant all on mythconverg.* to mythtv@"localhost" identified by "mythtv";
    mysql> flush privileges;
    mysql> quit

    再度mythtv-setupを実行すると,途中でコンソール画面になりチャンネルの選択画面になる.

    • 番組表を取得する.
      # mythfilldatabase

      すこし時間がかかる.

      # mythfilldatabase --manual --refresh-all --max-days 1

      個別に質問をされるので,チャンネル番号を入力する.

    • 入力とソースの接続
      先ほど設定したビデオソースをTelevisionと関連づける.
  • TV放送とANIMAXの併用
    アナログ入力からはTV放送を,combositeからはCSチューナー出力を入れANIMAXを録画するようします.
    ビデオソースでTV放送用とANIMAX用を別々に作成する.
    入力とソースの接続で,「Television」にTV放送のビデオソースを関連づけ,「combosite」にANIMAXのビデオソースを関連づける.
    しかし,このままだとTV放送は録画できたが,ANIMAXの放送がうまくいかない.

    • ANIMAXを録画したときのlog
      2007-08-04 00:46:05.342 Channel::GetCurrentChannelNum(0): Failed to find Channel '0'
      2007-08-04 00:46:05.342 Channel(/dev/video0)::TuneTo(0): Error, failed to find channel.
      2007-08-04 00:46:05.342 TVRec(4) Error: Failed to set channel to 0. Reverting to kState_None
      2007-08-04 00:46:05.342 TVRec(4): Changing from RecordingOnly to None
      2007-08-04 00:46:05.345 Canceled recording (Recorder Failed): 0 (724ch) "?  8? 4 00:46:00 2007": channel 2000 on cardid 4, sourceid 2
      2007-08-04 00:46:06.305 MainServer::HandleAnnounce Monitor
      2007-08-04 00:46:06.305 adding: cululu as a client (events: 0)
      2007-08-04 00:46:07.728 MainServer::HandleAnnounce Monitor
      2007-08-04 00:46:07.728 adding: cululu as a client (events: 0)
      2007-08-04 00:46:07.755 Reschedule requested for id 31.
      2007-08-04 00:46:07.779 Scheduled 1 items in 0.0 = 0.02 match + 0.01 place
      2007-08-04 00:46:08.407 Error deleting '/home/mythtv/2000_20070804004600.nuv': No such file or directory

      似たようなエラーの回避がmythtv-usersに投稿されていた.参考にして「入力とソースの接続」-「/dev/video0(combosite)」のページの「外部チャンネル変更コマンド」に「/bin/true」と入力する.すると録画がうまくできるようになりました.

  • mythfrontend
    mythfrontendを起動して,録画のプロファイルで画像サイズの設定などを行い,実際に録画予約する.うまくいけばメディアライブラリに録画がたまる.

mythwebのインストール

  • パッケージのインストール
    # apt-get install mythweb
  • 設定
    apacheのdefault rootのパスを変更しているので,シンボリックリンクの作りなおす.

    # cd /htmldir
    # ln -s /usr/share/mythtv/mythweb .

    apacheのユーザも変更してあるので,ファイルの所有者も変更する.

    # chown -R apache:apache /usr/share/mythtv/mythweb
    # chown -R apache:apache /var/cache/mythweb/image_cache

    apacheの設定ファイル(/etc/apache2/sites-available/default)に下記を追加する.

    <Directory "/htmldir/mythweb">
      Otions         FollowSymLinks
      AllowOverride   All
    </Directory>

    apacheを再起動して,http://127.0.0.1/mythwebにアクセスしてみる.

  • パスワード認証を追加する
    • パスワードファイルを作成する.
      # htpasswd -c /etc/apache2/httpd-passwords USER1
    • パスワードファイルのアクセスを制限する.
      # chmod 640 /etc/apache2/httpd-passwords
      # chown apache:apache /etc/apache2/httpd-passwords
    • apacheの設定ファイル(/etc/apache2/sites-available/default)を変更する.
       <Directory "/htmldir/mythweb">
         Options         Indexes FollowSymLinks
         AuthType Basic
         AuthName "MythTV"
         AuthUserFile /etc/apache2/httpd-passwords
         require user USER1
         Order allow,deny
         AllowOverride   All
      </Directory>

      apacheを再起動してmythwebのページにアクセスするとユーザ名とパスワードを問われる.

mythwebがモバイル用から戻らない

一度Advanced W-ZERO3からMythwebにアクセスをしたところ,以降PCでもmythwebの画面がモバイル用になって戻らなくなってしまった.mysqlのdbにユーザー毎のセッション情報が保存されてしまうためリセットが必要らしい.

$ mysql -u root -p
> use mythconverg;
> delete from mythweb_sessions;

これでリセットされて通常のレイアウトに戻る.
モバイルからもアクセスをする場合には異なるユーザー名を使うことが推奨されているみたい.

nuvからaviへの変換

最終的に録画した番組を,少し古いですが長瀬産業 DVX-500で見れるようにしたいです.しかし,試してみるとMPEG4でハードエンコードしたnuvファイル(のシンボリックリンク)の動画は再生されませんでした.
いろいろと調べてみるとnuvはMPEG1/2のストリームと互換があるようだが,MPEG4だとaviファイルにする必要があるらしいです.
試しにwis-go7007のドライバに付属のgorecordで録画した映像をwizd経由でDVX-500に読ませてみたら,ちゃんと再生・早送りなどができたので,音声・映像のコーデックは対応しているがファイルのヘッダーやインデックス情報がたりないのだと思います.

  • avidemux
    映像の編集ソフトです.これで読み込み・保存をしてもnuvからaviへの変換ができるとの情報がありましたので,試してみました.保存まえに"rebuild-index"を実行して保存したaviをDVX-500で読み込むと,映像・音声の再生と早送りなどもすることができました.
  • rebuild-indexのスクリプト化
    avidemuxは2.4.0からコマンドライン版も用意されています.コマンドライン版を使い自動的に実行されるようにスクリプトを作成しました.

    • nuv2avi_rebuilindex.sh
      #!/bin/bash
      CMD_AVIDEMUX="/usr/bin/avidemux2_cli"
      
      if [ -e "$*" ]; then
          INPUT_FILE="$*"
          TMP_FILE=`/bin/echo ${INPUT_FILE%.*}`"_tmp.nuv"
          OUTPUT_FILE=`/bin/echo ${INPUT_FILE%.*}`"_new.nuv" 
      
          $CMD_AVIDEMUX --autoindex --load $INPUT_FILE --rebuild-index --save $OUTPUT_FILE --quit
          if [ $? = 0 ]; then
              /bin/mv -f $OUTPUT_FILE $INPUT_FILE
              IDX_FILE=$INPUT_FILE".idx"
              if [ -e $IDX_FILE ]; then
                  /bin/rm -f $IDX_FILE
              fi
          fi
      fi

こちらのスクリプトを/usr/local/binに保存して,mythtv-setupでユーザージョブに「/usr/local/bin/nuv2avi_rebuildindex.sh "%DIR%/%FILE%"」と加えて,mythfrontendの設定でユーザージョブを有効にしました.録画実行後に自動的にnuvからaviに変換がされ,さらに番組名のシンボリックリンクも作成されるので,録画後すぐにDVX-500でみることができるようになりました.

ドライバの設定(kernel 2.6.24)

kernel 2.6.24用にドライバば更新されていました.ただしubuntu 8.04では素直にはインストールできないようです.

  • kernel headerのインストール
    $ sudo apt-get linux-headers-lum-2.6.24-21-generic linux-headers-2.6.24-21-generic
  • サウンドのkernelヘッダーを除外
    $ sudo /usr/src/linux-headers-2.6.24-21-generic/include/sound /usr/src/linux-headers-2.6.24-21-generic/include/sound-blacklisted
  • WIS Go7007のインストール
    • 開発環境がインストールされていない場合の事前準備
      $ sudo apt-get install build-essential
      $ sudo apt-get install libncurses5-dev
    • ダウンロードと展開
      $ wget http://nikosapi.org/software/WIS_Go7007/wis-go7007-linux-0.9.8-2.tar.bz2
      $ tar xjf wis-go7007-linux-0.9.8-2.tar.bz2
      $ cd wis-go7007-linux-0.9.8-2
    • kernel/Makefileに下記の一行を追加
      EXTRA_CFLAGS += -I /usr/src/linux-headers-lum-2.6.24-19-generic -include sound/config.h
    • apps/gorecord.cのL213を編集
      • 編集前
        if (!strcmp(gopath, canonpath))
      • 編集後
        if (!strncmp(gopath, canonpath, strlen(gopath))
    • ビルドの実行
      $ make
      $ sudo make install
  • usbfxのマウント設定
    $ cd wis-go7007-linux-0.9.8-1
    $ wd=`pwd`; sudo patch -d /etc/init.d -p0 -i "$wd"/patches/mountdevsubfs.sh-usbfs.patch
    $ sudo /etc/init.d/mountdevsubfs.sh start

ドライバの設定(8.04)

kernelを2.6.22-14にしたところ前のやり方ではコンパイルできないようでした.しらべるとドライバもバージョンアップされており,簡単にコンパイルできるようになっていました.

  • インストール
    $ wget http://nikosapi.org/software/WIS_Go7007/wis-go7007-linux-0.9.8-1.tar.bz2
    $ tar xjf wis-go7007-linux-0.9.8-1.tar.bz2
    $ cd wis-go7007-linux-0.9.8-1
    $ make
    $ sudo make install
  • usbfxのマウント設定
    $ cd wis-go7007-linux-0.9.8-1
    $ wd=`pwd`; sudo patch -d /etc/init.d -p0 -i "$wd"/patches/mountdevsubfs.sh-usbfs.patch
    $ sudo /etc/init.d/mountdevsubfs.sh start

ドライバの設定(7.04)

  • インストール
    $ wget http://oss.wischip.com/wis-go7007-linux-0.9.8.tar.bz2
    $ tar xjf wis-go7007-linux-0.9.8.tar.bz2
    $ cd wis-go7007-linux-0.9.8
    $ make

    AUDC_SET_INPUTの宣言が無いとかでコンパイルできない.Ubuntuのフォーラムにパッチの在処などが書いてあるのでパッチを当ててコンパイルをする.

    $ wget http://files.zoeloelip.be/wis-go-0.9.8-2.6.17.patch
    $ patch -p1 <  wis-go-0.9.8-2.6.17.patch
    $ make

    しかし今度は_IOWが宣言されていないとかでエラーがでる.

    /wis-go7007-linux-0.9.8/kernel/wis-saa7115.c: In function wis_saa7115_command’:
    /wis-go7007-linux-0.9.8/kernel/wis-saa7115.c:206: 警告: implicit declaration of function ‘_IOW’
    /wis-go7007-linux-0.9.8/kernel/wis-saa7115.c:206: error: expected expression before ‘int’
    /wis-go7007-linux-0.9.8/kernel/wis-saa7115.c:206: error: case ラベルを整数定数に還元できません
    /wis-go7007-linux-0.9.8/kernel/wis-saa7115.c:215: error: expected expression before ‘struct’
    /wis-go7007-linux-0.9.8/kernel/wis-saa7115.c:215: error: case ラベルを整数定数に還元できません
    /wis-go7007-linux-0.9.8/kernel/wis-saa7115.c:264: error: expected expression before ‘int’
    /wis-go7007-linux-0.9.8/kernel/wis-saa7115.c:264: error: case ラベルを整数定数に還元できません
    /wis-go7007-linux-0.9.8/kernel/wis-saa7115.c:284: 警告: implicit declaration of function ‘_IOWR’
    /wis-go7007-linux-0.9.8/kernel/wis-saa7115.c:284: error: expected expression before ‘struct’
    /wis-go7007-linux-0.9.8/kernel/wis-saa7115.c:284: error: case ラベルを整数定数に還元できません
    /wis-go7007-linux-0.9.8/kernel/wis-saa7115.c:328: error: expected expression before ‘struct’
    /wis-go7007-linux-0.9.8/kernel/wis-saa7115.c:328: error: case ラベルを整数定数に還元できません
    /wis-go7007-linux-0.9.8/kernel/wis-saa7115.c:372: error: expected expression before ‘struct’
    /wis-go7007-linux-0.9.8/kernel/wis-saa7115.c:372: error: case ラベルを整数定数に還元できません

    kernel/以下のフォルダのいくつかのファイルにヘッダーファイルの参照を追加する.

    • wis-saa7113.c,wis-tw2804.c,wis-tw9903.c
      <修正前>
      #include <linux/video_decoder.h>
      
      <修正後>
      #include <linux/types.h>
      #include <linux/ioctl.h>
      #include <linux/video_decoder.h>
    • wis-saa7115.c
      <修正前>
      #include <linux/video_decoder.h>
      
      <修正後>
      #include <linux/ioctl.h>
      #include <linux/video_decoder.h>

      再度コンパイル&インストール

      $ make
      $ sudo make install USE_UDEV=y

      付属のアプリケーションで動作テスト

      $ ./apps/gorecord -duration 60 capture.avi

      しかし,モジュールがないとエラーになってしまう.

      Unable to read /sys/bus/usb/drivers/go7007: No such file or directory
      Is the go7007-usb kernel module loaded?

      lsmodなどでみると該当しそうなモジュールはない.マニュアルでモジュールを読み込んでみる.

      #  modprobe go7007-usb
      WARNING: Error inserting snd_go7007 (/lib/modules/2.6.20-15-generic/extra/snd-go7007.ko): Unknown symbol in module, or unknown parameter (see dmesg)
      WARNING: Error inserting go7007 (/lib/modules/2.6.20-15-generic/extra/go7007.ko): Unknown symbol in module, or unknown parameter (see dmesg)
      FATAL: Error inserting go7007_usb (/lib/modules/2.6.20-15-generic/extra/go7007-usb.ko): Unknown symbol in module, or unknown parameter (see dmesg)

      読み込みに失敗する.メッセージどおりdmesgを見てみると

      [  246.655656] snd_go7007: Unknown symbol snd_card_free_in_thread
      [  246.688140] Linux video capture interface: v2.00
      [  246.706942] go7007: Unknown symbol go7007_snd_remove
      [  246.707098] go7007: Unknown symbol go7007_snd_init
      [  246.718990] go7007_usb: Unknown symbol go7007_read_addr
      [  246.719104] go7007_usb: Unknown symbol go7007_remove
      [  246.719290] go7007_usb: Unknown symbol go7007_boot_encoder
      [  246.719399] go7007_usb: Unknown symbol go7007_parse_video_stream
      [  246.719592] go7007_usb: Unknown symbol go7007_register_encoder
      [  246.719644] go7007_usb: Unknown symbol go7007_alloc
      [  246.719698] go7007_usb: Unknown symbol go7007_read_interrupt

      よくわからないが検索で引っかかったpatchを当ててみる.

      $ patch -p1 < wis-go7007-0.9.8-kernel-2.6.17.diff
       Reversed (or previously applied) patch detected!  Assume -R? [n] 
       などと聞かれるがとりあえずリターン
      $ make clean
      $ make
      $ sudo make install USE_UDEV=y
      # modprobe go7007-usb

      とりあえずエラーはでない.

      $ ./apps/gorecord -duration 60 capture.avi

      AV端子からの入力の録画が開始される.

nuvからaviへの変換

最終的に録画した番組を,少し古いですが長瀬産業 DVX-500で見れるようにしたいです.しかし,試してみるとMPEG4でハードエンコードしたnuvファイル(のシンボリックリンク)の動画は再生されませんでした.
いろいろと調べてみるとnuvはMPEG1/2のストリームと互換があるようだが,MPEG4だとaviファイルにする必要があるらしいです.
試しにwis-go7007のドライバに付属のgorecordで録画した映像をwizd経由でDVX-500に読ませてみたら,ちゃんと再生・早送りなどができたので,音声・映像のコーデックは対応しているがファイルのヘッダーやインデックス情報がたりないのだと思います.

  • nuv2avi
    Windowsでの再生のためにaviファイルフォーマットに変更するプログラムです.映像・音声の再エンコードをしないので,私の目的に近いです.
    こちらでnuvからaviに変換したものをDVX-500で読ませてみましたが,音声は再生されるが映像はまったく表示されませんでした.
    最近はあまりメンテナンスされていないようで,GCCのバージョンを3.3に指定してコンパイルしなくてはいけなかったりしましたので,コンパイルに失敗しているのかもしれません.
  • mencoder
    mplayerに付属のエンコーダーで"-oac copy -ovc copy"のオプションをつけると,映像・音声の再エンコードをすることなくaviフォーマットに変換されるとのことで試してみました.映像・音声ともにDVX-500で再生されるのですが,早送りなどをすることができませんでした.
  • avidemux
    映像の編集ソフトです.これで読み込み・保存をしてもnuvからaviへの変換ができるとの情報がありましたので,試してみました.保存まえに"rebuild-index"を実行して保存したaviをDVX-500で読み込むと,映像・音声の再生と早送りなどもすることができましたが,しかし再生をしていると段々と音声と映像がずれてきてしまいます.
  • mencoder&avidemux
    mencoderとavidemuxの良いところが合わさればと思い,mencoderで変換後に再度avidemuxで変換をさせたところ,映像・音声の再生,早送りなどのトリックプレイを正常に行うことができ,音声のズレも発生しなくなりました.
    avidemuxはGUIソフトなのですが,2.4(まだpreview版のようですが)からはコマンドライン用のプログラムも含まれるようになっていましたので,自動化できるようにスクリプトを作成しました.avidemux2.4preview2のコンパイルはavidemux wiki pageを参考にしました.

    • nuv2avi_rebuilindex.sh
      #!/bin/bash
      CMD_MENCODER="/usr/bin/mencoder"
      CMD_AVIDEMUX="/usr/local/bin/avidemux2_cli"
      
      OPT_MENCODER="-oac copy -ovc copy -forceidx -noskip"
      
      if [ -e "$*" ]; then
         INPUT_FILE="$*"
         TMP_FILE=`/bin/echo ${INPUT_FILE%.*}`"_tmp.nuv"
         OUTPUT_FILE=`/bin/echo ${INPUT_FILE%.*}`"_new.nuv"
      
         $CMD_MENCODER $OPT_MENCODER $INPUT_FILE -o $TMP_FILE
         if [ $? = 0 ]; then
             $CMD_AVIDEMUX --load $TMP_FILE --rebuild-index --save $OUTPUT_FILE
             if [ $? = 0 ]; then
                 /bin/mv -f $OUTPUT_FILE $INPUT_FILE
                 /bin/rm -f $TMP_FILE
                 
                 /usr/local/bin/page_gen.cgi
             fi
         fi
      fi

      こちらのスクリプトを/usr/local/binに保存して,mythtv-setupでユーザージョブに「/usr/local/bin/nuv2avi_rebuildindex.sh "%DIR%/%FILE%"」と加えて,mythfrontendの設定でユーザージョブを有効にしました.録画実行後に自動的にnuvからaviに変換がされ,さらに番組名のシンボリックリンクも作成されるので,録画後すぐにDVX-500でみることができるようになりました.