2015年1月16日金曜日 Linuxを用いたテレビ録画Serverでのロケフリ視聴が快適
で投稿したビデオサーバはその後も便利に使っている.
その後,いろいろカスタマイズしたので,列挙しておく.
カスタマイズ内容)
USからsshで入って,コンソールからphp, html, cgi等を書き換えている.バグで時々 htmlが表示されなくなったりするが,console logで分析状況を表示してデバッグしてから,最後に本当にdatabaseを書き換えるようにすれば,databaseを壊すこともなく,デバッグできている.米国から日本にアクセスする距離もあるがpingで測る限りは往復144ms程度なので,sshでtext baseでやる限りはあまり気にならない.(remote desktopのようにグラフィックベースで,echo backする状況で文章を書くと,遅くてイライラするが....)
以下リスト1,2,4,5への対応状況がわかるスクリーンショット(2015/12/31時点のもの)を以下に引用する.
3TBのHDDを使って,H.264のSD画質 (640x360)で保存している(画質は,普通の番組であれば27インチフル画面で十分満足できるレベル) なので,相当に大量に録画可能である.ほぼほぼ満杯になったときのために,自動消去する機能はまだ必要性を感じていない.
録画済一覧のスクリーンショット |
- mpeg2(1080i HDTV)からH.264(640x360)に変換する ffmpegでエラーが出る番組があるので,設定を解析し修正.主に以下への対応が必要だった.ffmpegで分析し,perlスクリプトで結果を解析し,ffmpegへの変換オプションを作成するよう自動化している.
- 解説音声,副音声のあるもののストリーム番号への対応
- 2014/4月の朝ドラ新編成で一旦TS(mpeg2)の録画ストリーム番号が変わっていたので,自動検出するように変更
- 常に変換ログをvideo置き場に残している
- 録画スクリプトは簡単に変更できて,オリジナルのTSファイルを残すこともて設定で変更可能.常に残すとdisk spaceを圧迫する
- サムネイル右クリックメニューで,mp4をダウンロードできる.これを追加して,
- TSが残っているときに,番組サムネイルを右クリックすればTS(HD画質)をダウンロードできるようにした.
- 番組説明ではmp4ファイルを流す.Google Chromeでは,自動的に動画viewerが立ち上がるが,IEやSafariではダメ.右クリックしてダウンロードしてからquick time playerとかで再生するしかない.
- 本来は,AFCファイルを流す.これは番組説明のクリックとして残した.が,どのブラウザもAFCは表示できない.画像ビューアVLCでは表示可能なので,ブラウザ設定でAFC型ファイルとVLCを関連付ければ可能かもしれない.
- ダウンロードしたmp4ファイルは,拡張子を.m4vに変えるとiTunesで再生可能だし,そのままiPhoneに転送して再生可能.
- git repositoryを作り,commitする.
- 適宜,repository等はcroneでNASにバックアップする.
- .htaccessに不備があり,ログイン許可を書いたファイルが外部アクセスされ変更されていた.git statusで発覚.firewallのログから,アクセスが合ったのはアジアの近隣国.ログイン許可ファイルを修正したが,git statusから再度別方法でファイルが変更されていた.ここの穴も塞ぐと同時に,webからアクセス可能なipアドレスを変更.以降,不正アクセスは発生していない.
BBrouterに穴を開けたり,外部アクセス可能なサーバを設置するときには,不正アクセス対策に加えて,容易に不正アクセスを検出できる手段が必要だと痛感した. - 録画済み一覧に,録画数,利用disk space,平均録画サイズ,可能録画本数の予測を表示するようにした.これは,recordedTable.phpを修正し,system()コマンドで,ls -al からawkをpipeで流すようにして値を求め,対応するtemplates/recordedTable.htmlを修正して表示している.
- 録画済みの各エントリに,ファイルサイズをMBで表示する.
- 一部を公開できるようにした.
- 公開用のdirectoryを作成し,そこにパスワード無しでアクセスできるindel.htmlを作成
- 上記directory配下のビデオ置き場に録画済みファイル(.mp4)をln すると,自動的に.mp4をlsするようperlのcgiスクリプトを作成し,それをデフォルトのhomeとして公開
- 公開・非公開はlnコマンドとrmコマンドでハードリンクを変更するだけだが,録画済みファイルが増えてくると面倒なので,録画済み一覧に列を追加して,公開・非公開のボタンを設置.表示時にphpで公開用directoryにファイルがあるかないかで,表示を切り替えている
- 今後,ボタンを押すことで公開・非公開を切り替えられるようにしたい.
- 時々,録画が終わっても録画予約にあるエントリが残ることがある.これは,録画予約データベース(RESERVE_TBL)のcomplete フィールドが0のまま残るため.この状態だと,録画済み番組ファイルの削除もできない.
- そこで,録画予約表示で使うreservationTable.php を改造し,録画予約状況表示時に録画終了時刻よりも現在時間のほうが遅いときには,強制的にcompleteフラグを立てるように変更(Smartyを使っているので,対応するPHPの配列を更新するだけであとは自動的に書き戻される).ただし,厳密には以下の様なやり方.
- 本来completeフラグを操作するrecorder.phpとの競合回避のため,終了時刻+600秒(10分)と現在時刻を比較している.
- 強制的にcompleteフラグをセットしたときには,video/reservationTable.logにフラグをセットした旨を追記する.
- PHPでのログの吐き出し方: http://www.php-labo.net/tutorial/php/file.html#write
- completeの未設定が検出されたときにも,録画予約表示には該当するエントリも録画予約として表示している.実際には,この時点でMySQLのデータベースが書き換わるので,次回からは表示されない.
- 番組表で,現時刻を示す,赤い横のラインが表示されるが,これがローカル時間になる.海外から番組表をアクセスすると本来あるべき日本時間ではなく,ブラウザの時間になる.これは,ブラウザのJavascriptで表示時に時間を取得し,現在時刻表示しているため.そこで,
- templates/index.htmlで記述しており,現時刻ラインのIDはtableNowBas
- templates/index.htmlに記載されているJavascriptを改造し,UTCのtimestamp( UNIXの秒表示(1971年よりの秒数)をミリ秒で表したもの)を取得,日本時間へ補正し,Date()で,日本時間のnow値を得ている.
- デバッグは,Google Chromeのコンソールとコンソール出力を利用.
ストリング表示すると,timezoneとしては,ブラウザのある地域のタイムゾーンのまま日本時間になるので気持ち悪いが,javascriptではタイムゾーンは見ていないので問題なく動く. - Date()の使い方:
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/prototype#Methods - Google Chromeのコンソールの使い方:
https://developer.chrome.com/devtools/docs/console - console.log('JST now: %s', now.toString()); などでコンソール表示してデバッグしたが,Chromeコンソール専用の出力コマンドもあるらしい..
See: http://blog.asial.co.jp/1152
今後やりたいカスタマイズ)
- 録画予約の高度化
- 簡易予約で,開始,終了時間を文字入力ではなく,iOSのような回転文字盤で変更できるようにする.これは,キーボードが日本語モードになっていると変換等でうっとおしいのと,数分ずらすつもりで入れ間違えるとおかしくなるため.
- 長時間番組を分割する.例えば1時間ずつセクションにわける.理由は,
- mpeg2録画終了後に,バッチでSDに変換をかけている.変換が終了したことは,録画済み番組表でサムネイルが表示できたこととため,長時間番組が見られるようになるまでに時間がかかる
- 長時間番組ではスクロールバーでの位置合わせが微妙なうえに,実際にファイルが転送されるまで待つので画像表示開始までに時間がかかる.
- 実時間に近い再生をしたい
- TSファイルに書き出してから,ffmpegをかけるのではなく,pipeで繋いで実時間transcodeしたい.
- さらには,TSファイルやmp4への書き込みが終了するまえに,視聴を開始したい.(実時間表示モード or タイムシフト表示モード)
- 消去機能
- チェックしておいてまとめて消去する機能
- ある時点より古いファイルをまとめて消去する機能
- 絞込検索で表示されたファイルに対して,1,2が適用できるようにしたい.
- ディスクスペースが減ってきた時に古いファイルから自動消去する機能