ページ

2012年7月19日木曜日

recpt1のsegfaultエラー対応

EPGrecとrecpt1で録画しはじめて1年半になるけれど、今までに何度か録画に失敗したことがある。

最初は、電子番組表の取得とダブったのかと思っていたけれど、どうやら違うことがわかった。

syslogを見ると以下のようなメッセージが表示されている。

kernel: recpt1[7212]: segfault at 0000000000708000 rip 0000003b2227ac44 rsp 0000000042bd6018 error 6

電子番組表の取得では頻繁に同じようなエラーが表示されているが、こっちは原因が違うようだ。

kernel: epgdump[8542]: segfault at 00007fff16868000 rip 000000000040319b rsp 00007fff16861df8 error 4

電子番組表は、再取得されるので無視しても良いのだが、通常の番組は困る。

で、以下のようにdo-record.shを書いて対応している。(以下、抜粋)

if [ ${MODE} == 0 ]; then
    $RECORDER --b25 --strip $CHANNEL $DURATION ${OUTPUT} >/dev/null &
else
    $RECORDER --b25 --strip --sid $SID $CHANNEL $DURATION ${OUTPUT} >/dev/null &
fi
PID=$! ← recpt1のpidを取得
sleep 8 ← segfaultエラーは必ずrecpt1起動して4秒後に発生しているので余裕をみて8秒待つ
COMM=$(ps -p ${PID} -o comm=)
if [ "${COMM}" != "recpt1" ]; then ← recpt1は起動しているかを確認し、落ちていれば再起動
    if [ ${MODE} == 0 ]; then
        $RECORDER --b25 --strip $CHANNEL $DURATION ${OUTPUT} >/dev/null &
    else
        $RECORDER --b25 --strip --sid $SID $CHANNEL $DURATION ${OUTPUT} >/dev/null &
    fi
fi
while : ← recpt1が終了するまで、待つ
do
  COMM=$(ps -p ${PID} -o comm=)
  if [ "${COMM}" != "recpt1" ]; then
    break
  fi
  sleep 1
done


上記のようにコードを記述してから、何度かsegfaultエラーが発生したが、今のところ録画には成功している。


しかし、ここ2日、「TMCC LOCK ERROR」という新しいエラーがではじめた。


いままでの対応で録画はできているのだけど・・・

2012年7月15日日曜日

Gmailのプッシュ通知が受け取れなくなった

iPod touchでGmailを使っていて、プッシュ通知を受け取るように設定しているんだけど、2日ほど前からプッシュ通知が受け取れなくなっていた。

どうも、最近、iPod touchの調子が良くないな~

1~2ヶ月ほど前から自宅のWiFiを使った現在地の特定ができなくなってしまっているし、フォトストリームを設定しているけど、1枚だけ送られたりして、キチンと動かないし・・・

で、Gmailのプッシュ通知についてなんだけど、ちょうど4日ほど前に、050電話のFUSION IP-Phone SMARTに加入した時に、プッシュ通知に対応したSoftphoneを設定したことが気になった。


FUSION IP-Phone SMARTの推奨アプリには、AGEPhoneとChiffonの2つがあるのだけど、AGEPhoneはバックグラウントには対応しているけど、CMがうざい(解除に\250)のとプッシュ通知には対応していないので、iPod touchでは裏アプリはすぐ(メモリ不足で)落とされてしまうからダメだった。
ChiffonについてはiOS版が開発中みたいだけど、元になっているLinphoneがAppStoreにあったので試したみた。でも、これは使い物にならなかった・・・
で、最終的に\600もするがSoftphoneに行き着いた。もしも、これが原因だとキツイな~

でも、どうやらSoftphoneが原因では無いようだ。しかし、Gmailのプッシュ通知が来ない・・・

しかたが無いので、最終手段(の一つ前)として、「すべての設定をリセット」を使ってみることにした。

これを実行するのは初めてなのだけど、どうやら「全てのデータとアプリケーション」は削除されないようだ。

で、実行するとiPod touchが再起動されて、初めて電源を入れた時(ワクワクしたのを覚えている)に表示される画面になった。

WiFiの設定は消えていたけど、Gmailなどの設定は残ったままだった。(ほっw)

で、Gmailアドレスにテストメールを送信すると、即座にプッシュ通知された。よかったよかった。








2012年7月14日土曜日

recpt1のhttp版パッチを適用してみた

少し前、なにげにググっていたらrecpt1にhttp版があることを知った。recpt1にhttp版パッチをあてることで、VLCから地デジやBSのチャンネルを指定して直接番組をストリーミング受信できるようになるとのことである。

パソコンを置いてある部屋にはアンテナの同軸ケーブルが来ていないので、これでやっとパソコンからテレビを見れるようになる!と思い、さっそくパッチを入手して適用してみた。

が、しかし、うまくいかなかった。仕方ないので、ググってみると同じようなパッチが他にも存在することが判った。

そこで、別のパッチを適用してみたけどやはりダメだった。

う~ん、原因がわからん。

で、最初のパッチと後のパッチを見比べるとビミョ~に違っている。そこで、それぞれのパッチを組み合わせてみることにした。

で、やっとのことでVLCからrecpt1に接続して地デジとBSを見ることができるようになった。

recpt1をhttpは起動するには以下のように指定して起動する。--httpの後に指定している8888はrecpt1側で待機するポート番号です。

$ recpt1 --b25 --strip --sid hd --http 8888

すると、recpt1は指定されたポートでhttp接続してくるの待っている。


VLCからは http://サーバのIPアドレス:ポート番号/チャネル番号 を以下のように指定して接続する。


すると、recpt1がチューナーからの映像をストリーミング送信し、VLCがそれを受信して再生される。

チャンネル変更が面倒な場合、各チャンネルをプレイリストに登録することで簡単にチャンネル変更ができるようになる。

こんな感じです。















早送り、巻き戻しのボタンでプレイリスト(チャンネル)を移動することもできます。

わたしは、地デジとBSのプレイリストを分けています。
















1年半ほど前からパソコンでテレビを見る方法を探していたのですが、USBデバイスサーバだとVistaの64bit版に対応していなかったり、ワンセグチューナーだと地デジしか見ることができないので諦めていました。

でも、やっとのことで実現できることができました。

ただ、標準のパッチだと、recpt1がチャンネルを切り替え終わる前に、別チャンネルに変えるとソケット受信エラーでrecpt1が終了してしまいます。

いちいち、サーバに接続してrecpt1を立ち上げるの面倒なので、落ちないように少しだけ修正しました。マージして少し修正したパッチは、(ここ)に置いておきます。


しかし、実際にパソコンでテレビが見れるようになってしまうと、パソコンではテレビを見ないことがわかった。と言うより、そこまでして見たい番組がないことが改めてわかった。

本を買ってしまうと、それで目的を果たしたような気持ちになって読まなかったり、ビデオを録画しても、それで満足して見なかったりするのと同じかな?!いや、ちょっと違うかな!?

2012年7月11日水曜日

MediatombをビエラのDLNAサーバとして使う(その9)

(前回)

MediatombをビエラのDLNAサーバとして使用しはじめて1年以上になるが、どうしても解決できない問題が1点だけあった。

それは、Mediatombでトランスコードをするように設定した場合、ビエラ側に映像のサムネイルが表示できないのである。というより、サムネイルは表示されるのだが映像がトランスコードされず、映像を選択すると、サムネイルが表示されてしまうのである。

他のデバイス(PS3やレグザ、ブラビアなど)では問題がないようで、ビエラ特有の問題のようである。また、ビエラ特有のバグなのかと思い、いろいろとググってみたが誰も問題視しておらず解決方法も載っていなかった。

仕方が無いので、Mediatombとビエラのパケットをキャプチャして色々なテストを繰り返すことでビエラの挙動がわかってきた。

まず、ビエラからMediatombにコンテンツ一覧の要求があった場合、以下のようなXMLデータが返される。
トランスコードのみ
次に、サムネイル表示を行うように設定した場合は、以下のようなXMLデータが返される。
トランスコードとサムネイル
トランスコードを行わなかった場合は、それぞれ<res>タグが1つ少なくなる。その場合は、ビエラ側では正しくサムネイルが表示され、映像も再生できる。


最初、ビエラ側のバグで3つの<res>タグがあると受け取れないのかと思い、いろいろ調べるとMediatombのconfig.xmlの設定でオリジナルリソースを表示させないようにできることがわかった。

<hide-original-resource>yes</hide-original-resource>

上記のように設定すると以下のようなXMLデータが返される。
オリジナルリソースを削除
この場合、オリジナルリソースの<res>タグが送られていない。しかし、この設定でもサムネイルが映像として再生されてしまう。


次に、<res>タグの順番が問題なのかと思い、Mediatombのconfig.xml設定で以下のようにしてトランスコードの<res>タグが一番下にくるように設定した。

<first-resource>no</first-resource>

この場合、以下のようなXMLデータが送られる。
タグの順番を変更
上記では、1.オリジナル、2.サムネイル、3.トランスコードの順番でXMLデータが返される。しかし、サムネイルが映像として再生されてしまう。


もう、原因がわからなかったので、しばらく放置していたが、あることに気がついた。DLNA.ORG_OP=XXの記述である。

オリジナルリソースの場合は、バイトシークなので DLNA.ORG_OP=01;DLNA.ORG_CI=0 である。
トランスコードの場合は、タイムシークなので DLNA.ORG_OP=10;DLNA.ORG_CI=1 (タイムシークで無ければ、DLNA.ORG_OP=00;DLNA.ORG_CI=1)である。

で、サムネイルを見てみると、DLNA.ORG_OP=01;DLNA.ORG_CI=0 となっている。

そこで、サムネイルにも、DLNA.ORG_OP=10;DLNA.ORG_CI=1 で送信するようにソースを変えてみると、サムネイルも表示されて映像も見れるようになった。

以下が、その場合のXMLデータです。
ORG_OP=10とした場合
どうやら、ビエラの場合、ORG_OPの値に優先順位を付けているようで、ORG_OP=01の優先度が一番高く、ORG_OP=00やORG_OP=10は優先度が低いようである。

で、ORG_OP=01のjpeg画像があって、ORG_OP=10の映像があっても、ORG_OP=01のjpeg画像を優先して再生してしまうようである。

<upnp:class>object.item.videoItem</upnp:class>とし指定して、ビデオ映像であると指定されているにも関わらず、jpeg画像を表示しているのである。

う~ん、やっぱりパナソニックのSEのレベルと言うか考え方が良くわかりません。バイトシークの32bitバグの件にしても、今回の件にしてもパナはいまいちですね。


上記のような挙動になるようにするには、Mediatombのソースを改造する必要があります。パッチは、(ここ)に置いておきます。私の場合、タイムシーク対応パッチを当てているので、それとの差分となります。一応、標準のトランスコードとタイムシーク対応トランスコードとオリジナルでのパケットが正しくなっているのを確認しましたが、我が家にはビエラ1台しかないので、その他のデバイスでは動作確認できませんでした。

また、サムネイルのキャッシュ対応パッチを当てると(サムネイル表示が高速になり)非常に快適な環境を作ることができます。

私の場合、<res>タグの順番は、1.オリジナル、2.サムネイル、3.トランスコードの順番のままにしています。というのは、PCからXBMCなどで再生する場合、先頭の<res>タグしか見ていないようで、そこにトランスコードのタグがあると、トランスコードされてしまいシークバーが使用できないからです。先頭にオリジナルタグがあれば、直接再生するのでシークバーも使用可能になります。

以上です。

後は、レジューム機能があればいいな~って思ってます。

MediatombをビエラのDLNAサーバとして使う(その8)

(前回)

MediatombをビエラのDLNAサーバとして使った場合、直接ファイルを再生する(バイト・レンジ・シークを使う)と早送りや一時停止で映像に復帰できない(ビエラ側の)バグがあることは前回に説明しました。

そこで、Mediatomb側にパッチを当てることでタイム・ベース・シークを可能にし、Mediatomb側からはトランスコードで映像を送信することで対応できることがわかりました。私は既に対応して半年以上ですが快適に使用できています。

まず、ここから Add time-based seek capability to transcoded streams というパッチをダウンロードしてMediatombに適用します。

次に、トランスコードの設定ですが、いろいろ細かいのと各自のやり方があるので方法は任せます。
ただし、標準の引数 %in %out の2つに加えて %seconds が追加されるので、%seconds を受け取って、ffmpeg の -ss オプションに渡せるようにします。

私は、トランスコードについては全てシェルを作って対応していますが、イメージとしては以下のようになるようにします。

ffmpeg -ss %seconds -i %in -vcodec copy -acodec copy -f mpegts -y %out

上記のキモは -ss オプションの位置です。-i オプションの後ろで指定すると、映像の先頭からデコードしながら開始位置を探すので、指定された秒数に比例して再生されるまでの時間が掛かってしまいます。-i オプションの前で指定すると一瞬で指定された秒数に飛ぶことができます。
※上記の設定が判るまでmencoderを使用したりしたが、音ズレと再生位置のズレがヒドくて使い物になりませんでした。

この方法を使うと映像と音声をコピーしているだけなのでCPUへの負荷はまったくありません。また、ビエラ側で経過時間が表示され、30秒スキップも使用できるので非常に便利になります。H.264にエンコードされたファイルでも使用可能です。

ただし、一点だけ注意点があります。PT2で録画した映像に関しては、ファイルの先頭部分がffmpeg にとっては不正な場合が多々あります。このような映像の場合、上記のように -i オプションの前に -ss オプションを指定すると ffmpeg がエラー終了してしまいます。-i オプションの後ろに指定した場合は問題ありません。

そこで、私は、PT2で録画した映像に関しては録画が完了すると -ss オプションで映像の先頭1秒をカットしたファイルを(-vcodec copy -acodec copyで)再作成するようにしています。そうすることで、上記のシェルでも問題なくトランスコードができるようになります。
また、録画を開始してから数秒遅れで1秒カットの映像を -re オプションで別ファイルに作成して、そのファイルを再生するとタイムシフト再生(一時停止やスキップ)も可能になります。


実際には、録画が完了した時点で、主に以下のことを行うシェルを実行させて映像の再作成を行っています。

1. Programが複数あれば、tssplitter_liteで先頭のprogramidだけを抽出する。抽出した後、以下のことを行う。

2. 先頭の60秒だけ音声の変更チェック(5.1chなど)を行い、音声の変更があったところから変換を開始する。(これは、PCからVLCで再生できるようにする為)

3. 先頭の10秒だけ二ヶ国語放送(ステレオの左と右で音声が違うバージョン)のチェックを行い、二ヶ国語放送の場合は、左と右の音声を分離してから再合成する。(これも、PCからVLCやXBMCで音声が出るようにする為)

4. 音声が複数ある場合は、-newaudio オプションで音声を追加する。

細かいところでは、EPGrecのサムネイルを再作成したり、他にもいろいろやっていますが、映像を再作成することで、いろんなデバイスから再生できるようにしています。

次回は、トランスコードを使用しててもビエラ側で映像のサムネイル表示ができるようにします。

(追記 2012年7月23日)
config.xmlのサンプルを(ここ)に置いておきます。
※ビエラは、mimetypeが「video/mpeg」でも「video/vnd.dlna.mpeg-tts」のどちらでもビデオファイルと認識して再生しようとします。
※再生に関しては、/usr/local/bin/mediatomb-mpeg2copy.shと/usr/local/bin/mediatomb-mpeg4copy.shの2つのシェルを作って、内部でffmpegでトランスコードしています。今は、2つの中身は同じですが、以前は、mpeg4copy.shのみlibx264でエンコードしたファイルをmpeg2に戻して再生していました。今は、両方ともコピー再生しています。mediatomb-mpeg2copy.shのサンプルも置いておきます。(一部省略していますが、使用可能と思います)

(つづく)