H.264動画をNALUごとに送信する
iSCPで定義されている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