VLCのエクステンションで地デジをリアルタイム視聴する

以前のエントリでpt1をGUIで操作するためのプログラムを紹介しました。
スナップショットはこんな感じです。

このプログラムは単に内部でrecpt1を実行しているだけなので、実際に地デジを視聴するにはvlcなどのメディアプレイヤーを別に起動しなくてはいけませんでした。もっとスマートな方法でできないか調べていたところ、vlcのエクステンション作成機能を使えばできそうだと分かったので、実際にやってみました。

vlcのエクステンションを使うにはバージョンの1.1以上が必要だそうで、ubuntu10.04で標準でインストールできるvlcのバージョンではエクステンションを使うことができません。なので、vlcのnightly buildを使うか、もしくはvlcをソースからコンパイルする必要があります。僕はソースからコンパイルする方法を試したので、その方法をここで紹介します。

vlcコンパイル

vlcコンパイルする方法は、こちらのページを参考にしました。

まずはじめに必要なパッケージをインストールし、競合するパッケージをアンインストールします。

sudo apt-get remove vlc vlc-data vlc-nox libvlc2 libvlccore2 mozilla-plugin-vlc vlc-plugin-jack vlc-plugin-pulse x264
sudo apt-get install checkinstall build-essential cmake libtool automake autoconf git-core ffmpeg libxcb-shm0-dev libxcb-xv0-dev libx11-xcb-dev libcdparanoia-dev libcdio-paranoia-dev libcdio-cdda-dev libqt4-dev qt4-dev-tools qt4-qmake nasm yasm libasm-dev lua5.1
sudo apt-get build-dep vlc

次にlibx264をコンパイルします。

wget ftp://ftp.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-20101002-2245.tar.bz2
tar jxf x264-snapshot-20101002-2245.tar.bz2
cd x264-snapshot-20101002-2245
./configure --enable-shared --prefix=/opt/local
make
sudo make install
sudo ldconfig

最後にvlcコンパイルします。vlcの最新の安定版のソースをダウンロードし、以下のコマンドを実行します。

export CPPFLAGS=-I/opt/local/include
export LDFLAGS=-L/opt/local/lib
tar jxf vlc-1.1.4.tar.bz2
cd vlc-1.1.4
./configure --prefix=/opt/local --enable-x11 --enable-xvideo --disable-gtk --enable-sdl --enable-avcodec --enable-avformat --enable-swscale --enable-mad --enable-libdvbpsi --enable-a52 --enable-libmpeg2 --enable-dvdnav --enable-faad --enable-vorbis --enable-ogg --enable-theora --enable-faac --enable-mkv --enable-freetype --enable-fribidi --enable-speex --enable-flac --enable-live555 --enable-caca --enable-skins --enable-skins2 --enable-alsa --disable-kde --enable-qt4 --enable-ncurses --enable-release --enable-realrtsp --enable-twolame --enable-real --enable-cddax --enable-mozilla --with-mozilla-pkg=xulrunner-plugin --enable-x264
make
sudo make install

ちなみに僕は自分でコンパイルするプログラムは/opt/localに入れているのでこのような設定になっています。プログラムのインストール先は適宜変更してください。

vlcからpt1を操作するLuaエクステンション

今回自作したvlcのエクステンションがこのプログラムです。

-- -*- coding: utf-8 -*-

channel_name_to_number = {}
channel_name_to_number["NHK総合"]     = 22
channel_name_to_number["NHK教育"]     = 13
channel_name_to_number["サンテレビ"]  = 26
channel_name_to_number["MBS毎日放送"] = 16
channel_name_to_number["ABCテレビ"]   = 15
channel_name_to_number["関西テレビ"]  = 17
channel_name_to_number["読売テレビ"]  = 14
channel_name_to_number["テレビ大阪"]  = 18

function execute_with_stdout(cmd)
   local p = io.popen(cmd)
   local s = p:read("*a")
   p:close()
   return s
end

dlg      = nil
dropdown = nil
is_plyaing = false

function descriptor()
    return { title = "地デジ視聴";
	     capabilities = {} }
end

function activate()
   dlg      = nil
   dropdown = nil
   is_plyaing = false
   create_dialog()
end

function deactivate()
   stop_pt1()
   vlc.playlist.clear()
   vlc.deactivate()
end

function close()
   vlc.deactivate()
end

function create_dialog()
   dlg = vlc.dialog("地デジ視聴")

   local label = dlg:add_label("チャンネル : ", 1, 1, 1, 1)
   dropdown = dlg:add_dropdown(2, 1, 1, 1)

   for name, number in pairs(channel_name_to_number) do
      dropdown:add_value(name, number)
   end
   
   dlg:add_button("選択", click_select_button, 3, 1, 1, 1)
 end

function click_select_button()
   stop_pt1()
   local channel = dropdown:get_value()
   start_pt1(channel)
   if not is_playing then
      play_pt1()
      is_playing = true
   end
end

function start_pt1(channel)   
   local pt1_cmd = string.format("recpt1 --b25 --strip --udp --addr 127.0.0.1 --port 1234 %d - /dev/null &", channel)
   os.execute(pt1_cmd)
end

function stop_pt1()
   local pt1_pid = tonumber(execute_with_stdout("pidof -s recpt1"))
   if pt1_pid ~= nil then
      os.execute(string.format("kill -KILL %d", pt1_pid))
   end
end

function play_pt1()
   local path = "udp://@127.0.0.1:1234"
   local name = "recpt1"
   local mytable = { path = path; name = name }
   vlc.playlist.add({mytable})
end

このプログラムを拡張子.luaで~/.local/share/vlc/lua/extensions/の中に保存すると、エクステンションがvlcから使用可能になります。エクステンションを使用するには、vlcのメニューの「表示」から「地デジ視聴」を選択します。このようなダイアログが表示されるので、チャンネルを選んで選択ボタンを押すと、そのチャンネルを見ることができます。

関西以外の地域の場合はソースコードの一番上のchannel_name_to_number変数を適宜編集してください。この変数はチャンネルの名前と地デジの物理チャンネルのマップになっています。

ちなみにこのプログラムはpt1が搭載されているパソコンと地デジを視聴するパソコンが同一の場合を前提にしています。