Shino's Bar

お家で使うLinuxtux


Linuxでテレビ録画

25 Sat 2003 (初出: 26 Dec 2002 )

パソコンでテレビを観るだけでは芸がないので、 次には録画をやってみます。

予約録画サーバーの計画はこちら

以下はいろいろなプログラムを試してみたレポートです。 結論を急ぐ方はFFmpegの導入 , XviDの導入をご覧ください。

xawtv + MJPEG tools でMPEG-1

Vine Linux 2.6ですとxawtvの最新版はなぜかコンパイルに失敗しますので xawtv-3.74 を導入しておきます。 同梱のプログラムに streamer というのがあります。
$ streamer --help とすると使用例などが出てきます。
$ man v4lctl でv4lctlの使用法も調べておきましょう。 xawtvを起動して適当なチャンネルを表示させてからいったん終了したのち、

$ v4lctl volume mute off
$ streamer -t 0:30 -s 352x240 -r 29.97 -o movie.avi -f mjpeg -F stereo

とかでカレントディレクトリに aviファイルができます。 これは xanimや xine などで再生できます。 このままではコーディングがMotionJPEGなどに限られ、 ファイルサイズが大きくなってしまいます。 MJPEG tools でMPG1にエンコードしてやります。

MJPEG toolsの導入方法はこちらを見てください

MPG1にエンコードする例も streamer --help にあります。これを参考にシェルスクリプト tv2mpg を作りました。 画面サイズは 352x240, 音声は stereoで固定です。/var/tmpを作業用に使いますので、高速で十分な容量のディスクを用意してください。 書式は 「tv2mpg -t 録画時間 -b ビットレート -o 出力ファイル名 局名 」 で、たとえば次のように使います。

$ tv2mpg -t 0:30 -b 2500 -o movie 12

tv2mpg を引数なしで呼ぶと最近に表示されたチャンネルを1150kbpsで10秒間 /var/tmp/movie.mpgに録画します。

$ echo "tv2mpg -t 30:00 -o kaiwa 12" | at 6:40

これで予約録画となり、パソコンの電源さえ落とさなければ 午前6:40〜7:10 の間を録画、その後 (Celeron 1GHzの場合で)約1時間掛けてMPEG-1に変換します。 Vineのデフォルト環境では映像や音声のデバイスファイルの使用許可はコンソールの使用者に与えられるので、上記予約を一般ユーザーで実行した場合はログアウトすると動かなくなりますので要注意。 この方法では高速のCPUと高速、大容量のハードディスクが必要 です。この例で作業用に/var/tmpに1.5GB程度の空きが必要。できあがりのMPEG-1ファイルは約300MB。

音声の録音にはミキサーによる入力ラインやボリュームの設定が必要です。 aumixや、alsaを使っているならgamixなどで録音関係のところを探ってください。 メインのボリュームの他に IGain などの名前で録音時のボリュームがあったり、 他にもスイッチがあったりしますので要注意。

参考にしたページ see MPEG ビデオファイルの作り方 by real-baishi.net

Zapping + rteで直接MPEG-1

直接MPEG-1 に録画できるものとしてmp1eというものがあり 試してみたのですが、V4L2でないと動かないみたいでした。 これを後継しているのは Zappingプロジェクト のRTEらしいのでこれを次には試してみる。 rte, zvbi, zapping のsrc.rpmは Zappingプロジェクト ダウンロードのページから。 光リモコンを使う場合は LIRC をインストールしておく。

しかしこのRTEはmp1eをGUIで操作するだけのものらしく、結局V4Lでは動かない。 RTEはmp1e以外にもavifile,divx4linuxなどをサポートしていて、これらをインストールしたのちRETをビルドするとffmpeg,divx4linuxなどもGUI操作できる。 しかし、divx4linuxはできたファイルがxineんどで読めず。 ffmpegによるMPEG-1ファイルは再生できたのだが、どうも指定のビットレートを無視するらしく、できたファイルがやたらデカい。

FFmpegで直接MPEG-1

いろいろ探しているとFFmpegが 中間ファイルを作らずキャプチャデバイスから直接MPRG-1へエンコードできることが分かりました。

FFmpegの導入方法はこちらを見てください

たとえば次のコマンドで12チャンネルをMPEG-1で30秒間録画します。

$ v4lctl setchannel 12
$ ffmpeg  -t 30 -s 320x240 -r 29.97 -b 2500 -ab 224 -ac 2 -f  mpeg  movie.mpg

次のコマンドはVideoCD規格に適合したファイルを作ります。

$ v4lctl setchannel 12
$ ffmpeg  -t 3600 -s 320x240 -r 29.97 -b 1150 -ab 224 -ac 2 -f  vcd  movie.mpg

FFmpegでMPEG-4

FFmpegはMPEG-1以外のエンコードもできます。 MPEG-4を試してみると、画質もそこそこでした。

$ v4lctl setchannel 12
$ ffmpeg  -t 30 -s 320x240 -r 29.97 -b 2000 -ab 224 -ac 2 -f  avi -vcodec mpeg4  movie.avi

avifile + vcr でDivX

圧縮率の高いコーデックとしてDivXがあります。これを利用できるvcrの導入を考えます。avifileなども必要です。 DivXはGPLライセンスではありません。 またDivXが利用するMPEG-4や音声圧縮にMP3を使う場合は特許権がからんできます。 したがって扱いには注意が必要ですが、とりあえず個人で使用する範囲では問題はありません。 詳しくは FAQ(英文)を。

avifileとvcrの導入方法はこちらを見てください

avifile-qtを導入すると avicapというGUIのキャプチャ・プログラムが付いてきて、 これだけでDivXコーデックで録画ができます。 音声のサンプリング・レートの指定を サウンドカード、ドライバがサポートしていない場合、異常終了してしまいます。 使い方に注意すれば使えそうです。 サウンドドライバはalsaを前提にしているみたいです。

このあとvcrも導入してみましたが、 どういうわけか録画した画面が上下左右反転(裏返し)しています。 2チャンネル掲示板 にこれへの対策パッチがありましたので、 これを当てると正常に録画できるようになりました。 vcrにはschedという予約のGUIも付いていますが、使い方がよく分からない...。

たとえばこのような~/.vcrrcを用意しておき、次のようなコマンドで1分間のMPEG-4(DivX)録画ができます。

$ vcr  -t 1 -r 320x240 -F 30  -b 192 -p 12 movie.avi

vcr は2001年11月リリースのversion 1.09以来開発が止まっており、avifile-0.6までしか対応していません。最新のavifileではビットレートなどの指定ができません。 また、私の環境(intel 815/alsa-0.9rc6)では音声(lameでMP3圧縮)がときどき潰れてしまいました。

June 19th, 2003 付けで vcr の新バージョンが公開されましたが、Vine Linux 2.6ではコンパイルできませんでした。

参考にしたページ see Linux によるビデオキャプチャサーバへの道のり

XviD + avifile(avirec/avicap)

GPLのMPEG-4コーデックとしてXviDというものが開発されています。 avifileがこれをサポートしており、同梱されている avirecでコマンドラインからの録画ができます。avifile-qtを導入すると avicapというGUIのキャプチャ・プログラムが付いてきます。 avirecでXviD を選択すると標準のままではビットレートが抑え目ですが、ビットレートを大きく指定することでかなり画質は良くなります。以下のコマンドのように時間を指定しないと1分間録画します。-L 8 -R 4 などのオプションで画面端の見苦しい部分を切り詰めることができます。

$ v4lctl setchannel 12
$ avirec -n ntsc -F 29.97 -x 320 -y 240 -L 8 -R 4 -q 100 -c "XviD" -a rc_bitrate=2000000 -b 192 movie.avi

私の環境(intel 815/alsa-0.9rc6)では音声の同期が外れたり、ときどき潰れてしまいました。

XviDの導入方法はこちらを見てください

XviD + mencoder

MPlayerに付属のmencoderでも録画できるようです。 使い方は net_halさんのページ(零Home)mencoderでTV録画 を参考。XviDを使ってたとえば次のようなコマンドで録画できます。(実際には1行で)

$ mencoder -tv driver=v4l:width=360:height=240:norm=NTSC -tv forceaudio:chanlist=japan-bcast -ovc xvid -xvidencopts bitrate=2500 -oac mp3lame -lameopts cbr:br=224 -o output.avi -endpos 10 tv://12

-fps を指定すると映像と音声との同期が外れてしまう(?)。

画質は比較的良いようです 。 できあがったファイルはWindowsなどではVLC Player で再生できました。

XviDの導入方法はこちら, MPlayerの導入方法はこちらを見てください。

Helix ProducerでRealVideo

REALNETWORKS社 も最近はオープン・ソース路線に踏み出したようで、これから期待できそうです。 Helix Producerを使ってRealVideoで記録するというのも選択枝の1つになるかもしれません。 現在無料配布されているHelix Producer Basicで作られるRealVideoの最新フォーマット(RealVideo9)はWindows,Mac,LinuxでRealOnePlayer、あるいはRealPlayer8にプラグインをアップデートすることで再生できます。 (14 Jan 2003 修正)

例えば次のようなコマンドで30秒間の録画ができます。-ac,-apは音声入力元の指定で、-ap 1は私の場合で、Line入力です。

$ v4lctl setchannel 12
$ producer -ac 0 -ap 1 -vc 0 -vp 0 -cs 320x240 -ad 512k -d 00:00:30 -o movie.rm

私の環境(intel 815/alsa-0.9rc6)では映像と音声との同期が取れず、長時間録画するとかなりずれてしまいました。

ATI All-In-Wonder (Vine2.5/2.6などXFree86-4.xで)編

GATOSでテレビ機能が使えます。 Video4Linuxのインターフェースを通じてここに挙げたソフトで 同じようにキャプチャができるようです。 GATOSが配布している AVviewはTcl/Tk-8.4.xが必要。ALSA 0.9も?

まとめ

SoftwareOut codeGUICUIPerformanceComment
xawtv + MJPEGtools MPEG-1NoYesWorks大容量HD、エンコード時間
Zapping + RTE (+mp1e) MPEG-1YesYesNot for meRequire V4L2
Zapping + RTE + avifile MPEG-1YesNoBitrate not adjustable
FFmpeg MPEG-1NoYesWorks
FFmpeg MPEG-4NoYesWorks
avifile (+avicap/avirec) MPEG-4(DivX)YesYesAudio NG
avifile + vcr (+sched) MPEG-4(DivX)?YesAudio NG
Bitrate not adjustable
XviD + avifile MPEG-4(XviD)YesYesAudio NG
XviD + mencoder MPEG-4(XviD)NoYesWorks WindowsなどではVLCで再生
Helix Producer Basic RealVideo9NoYesAudio not sync

FFmpeg でMPEG-4あるいはXviD + mencoderでMPEG-4(XviD)あたりが テレビ放送の録画という今回の目的に合致しているようです。

ただしWindowsやMacで標準のままではDivXやXviDなどの再生はできないようです。 WindowsではDivXコーデックをインストールすることでMediaPlayerで再生できるようになる(?)。 VLC media playerならOK。 Macの情報は Mac de MPEG4のページなどにあります。 Mac OS-XならばVLC media playerなど適切なソフトをインストールすればDivXやXviDなどの再生もできます。

LinuxでTV 録画関連リンク

アドバイスは E-mail で マスターまで
Shino's Bar goto [シノバー店内案内] [MPEG最前線!] [お家で使うLinux]