H.264 NAL Unitを使ってH.264データを送信する¶
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
'
デバイスコネクターの設定¶
intdash Edge Agent 2にデバイスコネクターを追加します。以下のコマンドを実行してください。
$ intdash-agentctl config device-connector up --create '
id: h264_nal_unit
data_name_prefix: 101/h264_nal_unit
dest_ids:
- recoverable
format: iscp-v2-compat
ipc:
type: fifo
path: /var/run/intdash/up-h264_nal.fifo
'
/var/run/intdash/up-h264_nal.fifo
というFIFOから取得したデータに、 101/h264_nal_unit
というdata_name_prefixを付与し、 recoverable
というストリームに送る設定です。
注釈
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
別のコンソールでデバイスコネクターを起動して、h264_nal_unitタイプのデータを
/var/run/intdash/up-h264_nal.fifo
に書き込んでください。注釈
EDGEPLANT T1用でdevice-connector-intdashを使用する場合のパイプライン設定ファイルは以下のとおりです。
/dev/video0
として認識されているUVCカメラからGStreamerを使って画像を取得し、h264_nal_unitとしてFIFOに書き出します。tasks: - id: 1 element: 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 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 - id: 2 element: h264-nalunit-split-filter from: [ [1] ] conf: clock_id: CLOCK_MONOTONIC delay_ms: 100 - id: 3 element: print-log-filter from: [ [2] ] conf: interval_ms: 10000 tag: video0 output: stderr - id: 4 element: file-sink from: [ [3] ] conf: flush_size: 100 path: /var/run/intdash/up-h264_nal.fifo
VTC 1910-S/VTC 1010で使用できる omxh264 のパイプラインについては、設定ファイルのサンプル(
/etc/dc_conf/gstreamer_h264_nalunit.yml
)を参照してください。Data Visualizerでリアルタイムデータを確認します。
送信エッジ側の送信帯域が狭い場合でもリアルタイム性が高い状態で動画を再生できます。
注釈
送信帯域が狭くなった場合にどうなるかを実際に試す場合には、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