フィルター設定

EPGデータの取得が完了すると,特定サービスのTSストリーミングが可能となります.

# mirakcコンテナーをバックグラウンドで起動
$ sudo docker compose up -d
Starting mirakc ... done

# 最初のサービス(NHK総合1)のIDを表示
$ curl -s http://localhost:40772/api/services | jq .[0].id
3273601024

# NHK総合1のTSストリーミングを実行(Ctrl+Cで停止)
$ curl http://localhost:40772/api/services/3273601024/stream?decode=0 >/dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 16.8M    0 16.8M    0     0  1578k      0 --:--:--  0:00:10 --:--:-- 1725k

しかし,今の設定のままでは,TSストリームをffmpegで変換したりすることはできません.なぜならば,フィルターが設定されていないためです.

フィルターは,TSストリームを標準入力から受け取り,処理後のTSストリームを標準出力に出力する外部プログラムです.mirakc自体にはこのような機能は実装されておらず,フィルター設定で指定された外部プログラムにTSストリームの処理を委譲します.

フィルターの動作を確認するため,以下のような設定を行ってみます.

config.yml:

filters:
  decode-filter:
    command: >-
      echo "{{{channel_type}}}/{{{channel}}} SID#{{{sid}}}"

設定反映のためmirakcコンテナーを再起動し,動作確認します.

# mirakcコンテナーを再起動
$ sudo docker compose restart

# decode-filter付きTSストリーミングを実行
$ curl -s http://localhost:40772/api/services/3273601024/stream?decode=1
GR/27 SID#1024

TSストリームをチャンネル情報に置き換えることに成功しました.

なお,filters.decode-filterは,Mirakurunのtuners.ymlでのdecoderに相当する設定です.

フィルターの動作確認も終了したので,実用的なフィルターを設定してみます.

filters:
  # Chinachu/Mirakurunの設定例より
  #
  # tsukumijima/libaribb25を使用する場合は,`arib-b25-stream-test -v 0`とログを
  # 制限する必要があります.これはSTDERRへの出力で`\r`が使用されており,これが原
  # 因でログのライン分割処理で問題が発生するためです.
  decode-filter:
    command: >-
      arib-b25-stream-test

また,以下のように外部サーバーでTSストリームを処理し,その結果をクライアントに返すことも可能です.

filters:
  decode-filter:
    # 標準入力から入力されるTSストリームをリモートホストtsdのTCP 40773ポートに転
    # 送し,tsdから返されたTSストリームを標準出力に出力
    #
    # "Broken pipe"エラーを回避するため`cool-write`オプションを指定
    command: >-
      socat -,cool-write tcp-connect:tsd:40773

socatは,配布しているmirakc/mirakcイメージにも含まれているツールです.詳しい説明はリンク先を見るかGoogle先生に教えてもらってください.

filtersプロパティーはチューナーごとに設定するのではなく,すべてのチューナーに対して共通で利用される設定です.そのため,特定のチューナーに対して特別な処理を行いたい場合は,渡されたテンプレートパラメーターを利用して処理を分岐するようなスクリプトを作成し,これをフィルターとして設定する必要があります.

試しに,以下のような簡単なbs-not-supportedスクリプトを作って,動作を確認してみます.

#!/bin/sh

CHANNEL_TYPE="$1"
CHANNEL="$2"

if [ "$CHANNEL_TYPE" = "GR" ]; then
  echo "$CHANNEL"
else
  echo "BS not supported"
fi

config.yml:

# 変更部分のみ記載
filters:
  decode-filter:
    command: >-
      bs-not-supported {{{channel_type}}} {{{channel}}}

docker-compose.yml:

# 変更部分のみ記載
...
    volumes:
      - mirakc-epg:/var/lib/mirakc/epg
      - ./config.yml:/etc/mirakc/config.yml:ro
      # 忘れずに`chmod +x bs-not-supported`しておくこと
      - ./bs-not-supported:/usr/local/bin/bs-not-supported:ro
...

以下のように表示されれば,bs-not-supportedスクリプトは機能しています.

$ curl http://localhost:40772/api/channels/GR/27/stream?decode=1
27

$ curl http://localhost:40772/api/channels/BS/BS15_0/stream?decode=1
BS not supported

results matching ""

    No results matching ""