H.264動画をNALUごとに送信する

iSCPで定義されているH.264 NAL Unitデータ型を使って、H.264の動画をリアルタイム送信するための設定例です。

../../_images/h264-nal-unit-sample.svg

図 30 H.264 NAL Unitデータ型を使って、H.264の動画をリアルタイム送信するための設定例

H.264 NAL Unitデータ型を使い適切に設定されたストリームで送信することで、受信側のVisual M2M Data Visualizerでは、伝送欠損せず受信できた最低限のデータのみを使った動画の再生が可能になります。データが欠損した個所はブロックノイズになったり、緑色の表示になったりしますが、これにより、送信エッジ側の送信帯域が狭い場合でも、リアルタイム性が高い状態で動画を再生できます。

重要

  • この設定例は、アップストリームh264_nal_unit_extra_unitsで、信頼性のない接続( qos: unreliable )を使用することで効果が発揮されます。 そのため、 トランスポート として、QUICを使用する必要があります。 QUICを使用するためにはサーバー側で設定が必要です。

  • H.264 NAL Unitデータ型は、H.264のNALUnit単位でデータポイントを送信するためのものです。

    Data Visualizerはこの方法で送信されたデータの再生が可能です。 Data Visualizer以外のアプリケーションを使って再生するには、この送信方法に合わせた再生処理を実装する必要があります。

トランスポートの設定

H.264 NAL Unitに適した送信をするために、トランスポートを設定します。

$ intdash-agentctl config transport --modify '
    protocol: quic
  '

アップストリームの設定

H.264 NAL Unitに適した送信をするために、以下の2種類のアップストリームを作成します。

アップストリームのID

概要

h264_nal_unit_key_units

信頼性のあるアップストリームを使用してNAL Unit単位でデータを送信します。 このストリームを使用して、再生に必須となるSPS/PPS/IDRのNAL Unitを送信します。

h264_nal_unit_extra_units

信頼性のないアップストリームを使用してNAL Unit単位でデータを送信します。 このストリームを使用して、nonIDRのNAL Unitを送信します。

これら2つのアップストリームを作成するには、以下のコマンドを実行してください。

$ intdash-agentctl config up --create '
    id: h264_nal_unit_key_units
    enabled: true
    recover: true
    persist: true
    qos: partial
    flush_policy: immediately
  '
$ intdash-agentctl config up --create '
    id: h264_nal_unit_extra_units
    enabled: true
    recover: true
    persist: true
    qos: unreliable
    flush_policy: immediately
  '

デバイスコネクターIPCの設定

デバイスコネクターからのデータを受け取るためにデバイスコネクターIPCを追加します。以下のコマンドを実行してください。

注意

DC_PROCESS_SRC_CONF_COMMAND では、GStreamerを使って動画を取得し、変換するコマンドを指定します。 以下の例ではGStreamerにおいてomxh264encを使用しています。omxh264encは、OpenMAX対応GPUを使って動画エンコーディングを行います。

パイプライン設定ファイルのサンプル /etc/dc_conf/gstreamer_h264_nalunit.yml 内の例も参考にして、使用するハードウェアに合ったコマンドを指定してください。

$ intdash-agentctl config device-connector up --create '
    id: h264_nal_unit
    data_name_prefix: 101/
    dest_ids:
      - recoverable
    format: iscp-v2-compat
    ipc:
      type: fifo
      path: /var/run/intdash/up-h264_nal.fifo
    launch:
      cmd: device-connector-intdash
      args:
      - --config
      - /etc/dc_conf/gstreamer_h264_nalunit.yml
      environment:
      - DC_PROCESS_SRC_CONF_COMMAND="gst-launch-1.0 -q v4l2src device=/dev/video0 ! videorate ! image/jpeg,width=1920,height=1080,framerate=15/1 ! jpegdec ! omxh264enc control-rate=2 iframeinterval=15 bitrate=3000000 bit-packetization=true slice-header-spacing=1200 insert-sps-pps=true insert-vui=true ! video/x-h264,stream-format=byte-stream ! queue ! h264parse ! queue ! fdsink fd=1"
      - DC_H264_NALUNIT_SPLIT_FILTER_CONF_DELAY_MS=100
      - DC_PRINT_LOG_FILTER_CONF_TAG=video0
      - DC_FILE_SINK_CONF_PATH=/var/run/intdash/up-h264_nal.fifo
'
  • launch で、device-connector-intdashを起動するように設定しています。

  • device-connector-intdashのパイプライン設定として、付属の /etc/dc_conf/gstreamer_h264_nalunit.yml を指定しています。 また、パイプライン設定で使用する環境変数を environment で与えています。

  • device-connector-intdashから /var/run/intdash/up-h264_nal.fifo を介して得られたデータは、 101/ というデータ名称プレフィックスを与えられて、 recoverable というIDを持つアップストリームに送信されます。

注釈

h264_nal_unitはiSCP v1には存在しないデータ型であるため、Data Visualizerで表示できるようにするために、特別なdata_name_prefixを設定しています。

フィルターの設定

h264_nal_unit データ型のデータポイントの行先を、さきほど作成した別のアップストリーム h264_nal_unit_extra_units に変更するフィルターを設定します。

$ intdash-agentctl config filter up --create '
    id: h264_nal_unit_filter
    enabled: true
    type: type
    target:
      type: h264_nal_unit
      dest_ids:
        - recoverable
    change_to:
      dest_id: h264_nal_unit_extra_units
'

次に、再生に必須であるデータポイントの行先を、さらに別のアップストリーム h264_nal_unit_key_units に変更するフィルターを設定します。

$ intdash-agentctl config filter up --create '
    id: h264_nal_unit_key_filter
    enabled: true
    type: h264-essential-nal-units
    target:
      dest_ids:
        - h264_nal_unit_extra_units
    change_to:
      dest_id: h264_nal_unit_key_units
'

注釈

h264-essential-nal-units タイプのフィルターは、再生に必須のNALユニット(SPS/PPS/IDR)を抽出するために存在する特別なフィルターです。

ストリーマーの起動

以上の設定ができたらストリーマーを起動します。

$ intdash-agentctl run

注釈

送信帯域が狭くなった場合にどうなるかを実際に試す場合には、Linuxのtcコマンドを使用するのが便利です。 NIC eth0の送信帯域を2700kbit/secに制限する例:

$ tc qdisc add dev eth0 handle 10: root tbf rate 2700kbit burst 10kb limit 10kb

上のコマンドで設定した帯域制限を解除するには以下を実行します:

$ tc qdisc del dev eth0 root