HLS

なんとほぼ1年ぶり。。
家族にテレビを占領されたので、なんとかタブレットMUSIC STATIONが見れんかなぁと、急遽HLS環境をでっちあげたら、意外にうまくいったのでメモ。先人とぐぐる先生に感謝。
環境はこんなの。OS更新せないかんなぁと思いつつ面倒で。。

$ sysctl hw.model
hw.model: Intel(R) Atom(TM) CPU D525   @ 1.80GHz
$ uname -v
FreeBSD 9.1-STABLE #0 r+d844ab2: Mon May 27 18:32:25 JST 2013 (snip)
$ pkg info | grep ffmpeg
ffmpeg-2.8.7_2,1               Realtime audio/video encoder/converter and streaming server
$ sysctl dev.ptx.0.%desc
dev.ptx.0.%desc: EARTHSOFT PT2

で、apache24のmod_userdirを有効にしといて、

$ cd ~/public_html/hls
$ sh hls.sh

としといて、Android(FireHDX8.9)のMXPlayerで、http://HOST/~user/playlist.m3u8で見れたー。
肝心のhls.shはこんなの。2時間(7200秒)で止まるけど。

perl recptx.pl --b25 24 7200 - \
ffmpeg -i - \
-analyzeduration 180M -probesize 100M \ -c:v copy \ -c:a aac -strict -2 -ac 6 -ar 32000 -ab 48k \ -bufsize 1200k \ -f hls \ -hls_time 10 \ -hls_list_size 30 \ -hls_allow_cache 0 \ -hls_flags delete_segments \ playlist.m3u8

最初は、サイズが小さいほうがいいかなぁと、

 -c:v libx264 -b:v 1200k -s 640x360

なんてしてみたら、14fpsくらいでとうてい追いつかず。上みたいに単にcopyしてもMXPlayerは再生してくれて、リアルタイムで問題なく見れました。
audioもcopyしたかったのだけど、エラーでffmpegが止まっちゃうので断念。

DISK交換

昨年の9月にほとんど同じ日記を書いてた。やっててよかったZFS

10/15に録画サーバが応答しなくなってるのに気づいて、コンソール見てみると断末魔が。

(ada1:ahcich1:0:0:0): READ_FPDMA_QUEUED. ACB: 60 08 18 49 00 40 00 00 00 00 00 00
(ada1:ahcich1:0:0:0): CAM status: ATA Status Error
(ada1:ahcich1:0:0:0): ATA status: 61 (DRDY DF ERR), error: 04 (ABRT )
(ada1:ahcich1:0:0:0): RES: 61 04 d1 cc 02 40 21 00 00 00 00
(ada1:ahcich1:0:0:0): Retrying command
(ada1:ahcich1:0:0:0): READ_FPDMA_QUEUED. ACB: 60 08 18 49 00 40 00 00 00 00 00 00
(ada1:ahcich1:0:0:0): CAM status: ATA Status Error
(ada1:ahcich1:0:0:0): ATA status: 61 (DRDY DF ERR), error: 04 (ABRT )
(ada1:ahcich1:0:0:0): RES: 61 04 d1 cc 02 40 21 00 00 00 00
(ada1:ahcich1:0:0:0): Error 5, Retries exhausted
swap_pager: I/O error - pagein failed; blkno 264463,size 4096, error 5
vm_fault: pager read error, pid 98520 (http)

どうにもならないのでリセットして再起動、立ち上がった後のzpoolはこんな感じ。

  pool: ztank
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://illumos.org/msg/ZFS-8000-2Q
  scan: resilvered 2.64T in 22h39m with 0 errors on Tue Sep 16 11:01:07 2014
config:

NAME                     STATE     READ WRITE CKSUM
ztank                    DEGRADED     0     0     0
  mirror-0               DEGRADED     0     0     0
    7724617931313753760  UNAVAIL      0     0     0  was /dev/ada1p3
    ada0p3               ONLINE       0     0     0

これが木曜の夜で、そのままAmazonで同じWD30EZRXを注文、金曜に帰ってきたら届いているという、21世紀ってすごいね。。

DISKを取り替えてシングルユーザで起動したら、何かそのままresilverが走り出した?

  pool: ztank
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
	continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Sat Oct 17 11:48:15 2015
        2.35G scanned out of 2.67T at 1/s. (scan is slow, no estimated time)
        7.81M resilvered. 0.09% done
config:

	NAME                                   STATE     READ WRITE CKSUM
	ztank                                    ONLINE       0     0     0
	  mirror-0                             ONLINE       0     0     0
            7724617931313753760  UNAVAIL      0     0     0  was /dev/ada1p3
	    ada0p3                            ONLINE       0     0     0

errors: No known data errors

取り替えるより先にpoolから抜いとくべきだったのかなあ。とりあえず外す。

# zpool detach ztank ada1p3
# zpool status
  pool: ztank
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
	continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Sat Oct 17 12:20:15 2015
        29.6G scanned out of 2.67T at 21/s, (scan is slow, no estimated time)
        7.81M resilvered, 1.08% done
config:

	NAME        STATE     READ WRITE CKSUM
	ztank       ONLINE       0     0     0
	  ada0p3  ONLINE       0     0     0

errors: No known data errors

シングルユーザモードでの、いつもの作業前のお約束。

# mount -u /
# zfs mount -o ro ztank/usr
# zfs mount ztank/var
# zfs mount ztank/var/empty
# zfs mount ztank/tmp
# /etc/rc.d/adjkerntz start

HDDが同じなので、既存のada0と同じようにgpart。

# gpart show ada0
=>        34  5860533101  ada0  GPT  (2.7T)
          34           6        - free -  (3.0k)
          40         128     1  freebsd-boot  (64k)
         168     2097152     2  freebsd-swap  (1.0G)
     2097320  5858435808     3  freebsd-zfs  (2.7T)
  5860533128           7        - free -  (3.5k)
# gpart create -s GPT ada1
ada1 created
# gpart add -b 40 -s 128 -t freebsd-boot ada1
ada1p1 added
# gpart add -b 168 -s 2097152 -t freebsd-swap ada1
ada1p2 added
# gpart add -b 2097320 -t freebsd-zfs ada1
ada1p3 added
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
bootcode witten to ada1

このままシングルユーザでattachしてresilver待ちすると、今日の録画予約が間に合わん。。ということで、
リブート通常起動してから、続き。

# zpool status
  pool: ztank
 state: ONLINE
  scan: resilvered 7.81M in 9h17m with 0 errors on Sat Oct 17 21:06:00 2015
config:

	NAME        STATE     READ WRITE CKSUM
	ztank       ONLINE       0     0     0
	  ada0p3  ONLINE       0     0     0

errors: No known data errors

9時間ずれてるな。。

# zpool attach ztank ada0p3 ada1p3
Make sure to wait until resilver is done before rebooting.

If you boot from pool 'ztank', you may need to update
boot code on newly attached disk 'ada1p3'.

Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:

        gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0

しばらくたった後。

# zpool status
  pool: ztank
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
	continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Sat Oct 17 12:20:15 2015
        33.4G scanned out of 2.67T at 10.6M/s, 72h28m to go
        33.4G resilvered, 1.22% done
config:

	NAME        STATE     READ WRITE CKSUM
	ztank       ONLINE       0     0     0
	  mirror-0  ONLINE       0     0     0
	    ada0p3  ONLINE       0     0     0
	    ada1p3  ONLINE       0     0     0  (resilvering)

errors: No known data errors

残り72時間って。。

お名前検討中(仮)だったもの

コメントありがとうございました。ということで、頂いたまんまですが、名前決めたー。

VAniRA - Video Anime Recording App

ぐぐるさんには、「もしかしてvanillaじゃね?」と言われて矯正されるので、なかなか検索難易度高いですが。

いつものGoogleCodeにproject作ったー。けどまだ空っぽです。

ところで、CakePHPで作ったこのアプリ?サイト?って、どれを公開すればいいのかしら。appの下ごっそり?CakePHPに含まれないファイルだけ?それともCakePHPのgit cloneしてbranchして開始?うーん、世の中の例がないか調べてみよう。。

お名前検討中(仮)その4

何となく動いてるようだし、年内にはgoogle codeに挙げるかーと思いつつ、
未だに決まらない名前。もういっそ(仮)を名前にしちゃうかー、とか思ってたら、コメントいただいちゃいまして、ありがとうございます。も少し考える。
しばらく回してて分かってきたことメモ。
新番組表示。しょぼかるの話数がemptyか1のものを拾ってたのだけど、通常放送なのにemptyのものが結構ある。でもこれを外すと特番を見逃す可能性がある。うーん。
php連想配列のソートが遅い。録画一覧を、タイトル毎にグループ化して、新しく録画追加されたタイトルが先に来るように表示してる。
(分かる?)order byだけで出来ないので、selectした後で並び替えてるけど、selectは
数msなのに、画面表示に数秒かかる。うーん。
phpでdaemonize。お約束通りfolkしてsetpgrpして、fd 012をクローズしてexec、とすると、クローズのあたりで消滅する。そこをコメントアウトすると最後まで動く。うーん。まあ動いてるからいい。。か?

お名前検討中(仮)その3

土曜日に予備サーバにしかけておいて様子見。録画まわりはだいたいなんとかなったかな。予約どおりのファイルができてた。
ファイルのextattrにタイトルを埋めるところが間違ってて、全ファイルのタイトルが title になってしまったー。直した。
チューナーがふさがってたりディスクがあふれた時のエラーハンドリングは皆無、まあ諦める。
録画したのを観るのに使ってるオレオレDLNAサーバが、ソースにUUIDを埋め込んでたのを忘れてた。これではLAN内で同時に複数起動できないので、httpd.confので指定できるように直した。
さて、あとはファイル削除をControllerから叩けるようにして、インストーラー(DBのセットアップと、Stationの初期化)Shellを入れたら、だいたいおしまいか?ああ、スマホ版画面を作るというのもあったな。。。
それより!お名前!!
cakeなのでお菓子っぽいのが良さそう。綴りのどこかにrecorderとかanimeとかの欠片が入ってるのがいいなあと思ったのだけど、なかなかそんなお菓子がみつからないー。

行く川の流れは絶えずして

お名前検討中(仮)の動作環境を作ろうと、10-Releaseを入れたのが半月前。使いそうなpkgをポチポチ入れたので、必要なファイルを持ってきて設定を始めたら、いろいろ引っかかったという話。
その1、mod_authz_core。
apacheの設定なんて、最後に変えたのはいつだろうって感じですが、元の環境から持ってきたものが、どうも動きがおかしい。結局答えは上だった。現行環境がapache22で、今度のがapache24で、いやー、いろいろあるよね、世の中。

Order allow,deny
Allow from all

は、ナウなヤングには

Require all granted

だそうです。あらまあ。
その2、mediainfo。
録画ファイルのbitrate計算に、mediainfoのライブラリを使ってるのだけど、現行環境を作った時のportsはライブラリをinstallせずコマンドのみ入るようになってた。しょうがないので、野良コンパイルして作ったライブラリをリンクして使ってたのでした。
今回pkgにmultimedia/libmediainfoが増えてたので、そのままリンクすればいいかと思ったらさにあらず。何故かC++ APIだけ入ってて、C APIが入ってない、かつ-DUNICODEされてるもんだから受け渡しがwchar_tになっていて、すげー使いづらい。Openするファイル名をconst wchar_t*で渡せって、何の嫌がらせだー。うがー。
といってもしょうがないので、C++ API使うように、charとwchar_tの相互変換するように書き換えたのでした。
いっそまた野良で、というのも手だったが、mediainfoのmakeもやたら面倒だった覚えがあるし。今後も考えるとpkgを使う方が楽。。。なはず。。。

やはり放送変更追従が。。

DTV板で、サイコパス2の1話の録画ミスったー、というのを見かけたので、見てみたらうちもくらってたー。あうー。
続く、四月は。。はちゃんと録れてた。担当者の方には、夜中までメンテご苦労様です。
やっぱりEPG追従は欲しいかなあ。もともとEPGから予約してたら、同じサービスIDで追いかけられそうなんだけど、しょぼかるのPIDとEPGのIDをバインドする、いい方法を思いつかないのよね。
変更かかる前のそれっぽい時間帯の番組とみなしておくかなあ。タイトルの文字列の類似度が高いものを採る?いやいや。。。