第15章 AVコーデックミドルウェア

15.1. AVコーデックミドルウェアとは

AV コーデックミドルウェアは、Armadillo-800 シリーズでマルチメディア処理 (H.264/AVC 動画・AAC 音声・JPEG 画像の変換処理) をスムーズかつ効率的に行うためのミドルウェアです。Armadillo-800シリーズに搭載されているアプリケーションプロセッサー「R-Mobile A1」には、メインの ARM コア以外にリアルタイム制御用の SH-4Aコアとマルチメディア処理専用プロセッサが搭載されています。マルチメディア処理は、多くの場合システムに負荷をかけることが多く、メイン CPU で処理をするとシステム全体のパフォーマンスが低下します。AV コーデックミドルウェアを利用することで、メイン CPUのパフォーマンスを落すことなく、マルチメディアの処理を行うことができるようになります。

AV コーデックミドルウェア使用時の内蔵コアの対応

図15.1 AV コーデックミドルウェア使用時の内蔵コアの対応


上図に示すように、AV コーデックミドルウェアを使う場合には R-Mobile A1 に搭載されている以下の専用プロセッサは SH 側で管理されます。

  • Video Multi Codec (VCP1)

  • Video I/O 6 (VIO6)

  • Sound Processing Unit 2 (SPU2)

  • JPEG Processing Unit (JPU)

AVコーデックミドルウェアが対応しているフォーマットは以下の通りです。

  • デコーダーが対応しているフォーマット

    • H.264/AVC

    • AAC

  • エンコーダーが対応しているフォーマット

    • H.264/AVC

    • AAC

    • JPEG

マルチメディアは、比較的大きなデータを扱います。そのためマルチメディア処理を行う専用プロセッサや管理する SHもメインメモリを利用する必要があります。AV コーデックミドルウェアを利用する時には、Armadillo-800シリーズに搭載されているDDR3 SDRAM 512MBのうち128MBをAVコーデックミドルウェアに割り当てる必要があります。AVコーデックミドルウェアドライバが追加されたlinux-3.4-at6以降では、デフォルトでLinuxカーネルが管理するメモリを384MBに制限しています。

AV コーデックミドルウェア使用時のメモリマップ

図15.2 AV コーデックミドルウェア使用時のメモリマップ


このように、多くのプロセッサが協調動作をすることで、Armadillo-800 シリーズではH.264/AVC 動画やAAC音声などのマルチメディアデータをスムーズかつ効率的に扱うことができます。

さらにAVコーデックミドルウェアは、アプリケーションプログラムからマルチメディアデータを容易に扱えるよう、Linuxで標準のマルチメディアフレームワークGStreamer [http://gstreamer.freedesktop.org/]に対応しています。

GStreamer ロゴ

図15.3 GStreamer ロゴ


GStreamer は、エレメントと呼ばれる処理単位を繋ぎ合わせパイプラインを作成することで、複雑な要求に対応できるマルチメディアフレームワークです。MP4ファイルを扱うエレメントや、様々な画像フォーマットを変換するエレメントなどが標準で用意されているため、このフレームワークを活用することで、様々なフォーマットのマルチメディアデータを統一的な操作で、簡単に扱うことができます。

15.2. AVコーデックミドルウェアの仕様

15.2.1. AACデコーダー

表15.1 AACデコーダー仕様

符号化方式
  • 準拠規格 ISO/IEC 13818-7:2006、ISO/IEC 14496-3:2009

  • 対応フォーマット AAC-LC、HE-AAC v1、HE-AAC v2

ビットレート
  • AAC-LC 8k~576k bit/sec、VBR

  • HE-AAC v1/v2 8k~144k bit/sec、VBR

入力フォーマット
  • RAW形式 / ADTS形式

入力チャネル
  • AAC-LC [a]

    • 1チャネル(モノラル)

    • 2チャネル (ステレオ、デュアルモノラル、パラメトリックステレオ)

    • 4チャネル (3/1) [b]

    • 5チャネル (3/2)[b]

    • 5.1チャネル (3/2+LFE)[b]

  • HE-AAC v1/v2

    • 1チャネル (モノラル)

    • 2チャネル (ステレオ、デュアルモノラル、パラメトリックステレオ)

出力チャネル 1チャネルか2チャネル (ダウンミックス対応)
サンプリング周波数
  • AAC-LC: 8k/11.025k/12k/16k/22.05k/24k/32k/44.1k/48k/64k/88.2k/96k Hz

  • HE-AAC v1/v2: 8k/11.025k/12k/16k/22.05k/24k Hz

[a] 3チャネル(3/0、2/1)、4チャネル(2/2)は非サポート

[b] (/)は、(前方/後方スピーカのチャネル数)を示す


15.2.2. H.264/AVCデコーダー

表15.2 H.264/AVCデコーダー仕様

最大ビットレート

40M bit/sec [a]

入力フォーマットVideo Elementary Stream
出力フォーマット
  • YUV420

  • RGB32

  • RGB24

  • RGB16

サポートプロファイル/レベル
  • Baseline Profile Level 4.1

  • Constrained Baseline Profile Level 4.1

  • Main Profile Level 4.1

  • High Profile Level 4.1

プロファイル共通非サポートツール
  • ASO (Arbitrary Slice Ordering)

  • FMO (Flexible Macroblock Ordering)

  • RS (Redundant Slices)

ピクチャ構造
  • フレーム構造 (プログレッシブシーケンス / インタレースシーケンス [b] )

  • フィールド構造 (インタレース)

  • フレーム / フィールド混在構造 (インタレースシーケンス)

エントロピー符号化CAVLC / CABAC
ピクチャタイプI / P / B ピクチャ
マルチスライスサポート。1フレームあたりの最大スライス数は68スライスまで(画像サイズ1920x1080の場合、1スライス/1マクロブロックライン相当)
マルチリファレンスサポート
マルチシーケンス

サポート。ただし、シーケンスを通じて以下の条件満すこと

  • 画像サイズ、フレームレートが変化しないこと

  • エンコード時のビットレート設定が同じであること

マルチストリーム非サポート
データ・パーティショニング非サポート
画像サイズ
  • プログレッシブシーケンスの場合: 128x96~1920x1080 [c]

  • インターレースシーケンスの場合: 352x480~1920x1080 [d]

画像の拡大・縮小幅、高さともに拡大: 最大16倍まで、縮小: 最少1/16まで

[a] 最大ピーク時のビットレートが40M bit/sec 以下であること

[b] インタレースシーケンスの場合、30fpsの場合画像サイズ1440x1080まで、画像サイズ1920x1080であれば20fpsまで

[c] 水平2画素、垂直2ライン単位で設定可能

[d] 水平2画素、垂直4ライン単位で設定可能


15.2.3. AACエンコーダー

表15.3 AACエンコーダー仕様

準拠規格
  • ISO/IEC 13818-7:2006

ビットレート

16k ~ 288k bps、VBR [a]

対応チャネル
  • 1チャネル(モノラル)

  • 2チャネル (ステレオ、デュアルモノラル)

入力フォーマット

16bit PCM

入力サンプリング周波数

8k/11.025k/12k/16k/22.05k/24k/32k/44.1k/48k Hz

出力フォーマット

AAC-LC(RAW形式、ADTS形式)

[a] 1チャネルあたり


15.2.4. H.264/AVCエンコーダー

表15.4 H.264/AVC エンコーダー仕様

最大ビットレート

40M bit/sec [a]

最大フレームレート

水平画像サイズ1280以下かつ垂直画像サイズ720以下の場合

  • 60 frame/sec

上記以外

  • 30 frame/sec

最大参照フレーム2フレーム
入力画像サイズ

画像幅

  • 80~1920 [b]

画像高さ

  • 80~1088 [c] [d]

入力フォーマットYUV420
出力フォーマットVideo Elementary Stream
プロファイル/レベル

条件により自動で選択

  • Baseline Profile Level 4.1

    以下条件を全て満たす場合に選択されます

    • フレーム構造(プログレッシブシーケンス)

    • Bピクチャなし

    • 画像サイズが1920×1080未満

  • Main Profile Level 4.1

    以下条件を満たすときに選択されます

    • Bピクチャあり

  • High Profile Level 4.1

    以下条件を満たすときに選択されます

    • 画像サイズが1920×1080

プロファイル共通非サポートツール
  • ASO (Arbitrary Slice Order)

  • FMO (Flexible Macroblock Ordering)

  • RS (Redundant Slice)

  • MBAFF (Macroblock-Adaptive Frame-Field) coding

  • Weighted Prediction

ピクチャ構造

フレーム構造 (プログレッシブシーケンス)

エントロピー符号化

Baseline Profileの場合

  • CAVLC

Main ProfileまたはHigh Profileの場合

  • CABAC

動き探索範囲

水平

  • -64~63.75画素

  • -32~31.75画素(画像幅が144以下のとき)

垂直

  • -32~31.75

サブサンプリング

  • 1/4サブサンプリング

ピクチャタイプI / P / B ピクチャ
イントラMBリフレッシュ サポート [e]
イントラ予測方式4×4、8×8、16×16画素単位イントラ予測
変換方式4×4、8×8整数変換
マルチスライス非サポート
マルチリファレンス非サポート
階層エンコード非サポート
マルチシーケンス非サポート
マルチストリーム非サポート
リエントラント対応なし

[a] 最大ビットレートの設定値であり、レートを保証するものではありません

[b] 2画素単位で指定可能

[c] 2ライン単位で指定可能

[d] 画像幅×画像高さが32の倍数であること

[e] 先頭のみIピクチャのとき適用


15.3. GStreamer - マルチメディアフレームワーク

GStreamerは、オープンソースのマルチメディアフレームワークです。小さなコアライブラリに様々な機能をプラグインとして追加できるようになっており、多彩な形式のデータを扱うことができます。GStreamerで扱うことができるデータフォーマットの一例を下記に示します。

  • コンテナフォーマット: mp4, avi, mpeg-ps/ts, mkv/webm, ogg

  • 動画コーデック: H.264/AVC, Vorbis

  • 音声コーデック: AAC, Theora, wav

  • 画像フォーマット: JPEG, PNG, BMP

  • ストリーミング: http, rtp

GStreamerでは、マルチメディアデータをストリームとして扱います。ストリームを流すパイプラインの中に、エレメントと呼ばれる処理単位を格納し、それらをグラフ構造で繋ぎ合わせることで、デコードやエンコードなどの処理を行います。例えば、図15.4「GStreamerの実行例」に示すコマンドを実行した場合のパイプラインは図15.5「GStreamerのパイプライン例」となります。

[armadillo ~]# gst-launch-1.0 filesrc location=/mnt/big-buck-bunny-30sec-fullhd.mp4 \
 ! qtdemux name=demux0 \
 demux0.audio_0 ! queue ! acmaacdec ! audioresample ! audio/x-raw,rate=48000,channels=2 ! alsasink \
 demux0.video_0 ! queue ! acmh264dec ! acmfbdevsink device=/dev/fb0

図15.4 GStreamerの実行例


GStreamerのパイプライン例

図15.5 GStreamerのパイプライン例


[注記]

拡大してご覧ください。

GStreamerのパイプラインは、シェルスクリプトのパイプ構文の構造に似ています。GStreamerの各エレメントとシェルスクリプト内のコマンドを対比することができます。構文的な違いとして、GStreamerのパイプラインは「! 」を使って各エレメントを繋ぎますが、シェルスクリプトは「| 」を使います。

シェルスクリプトで使うコマンドが引数を取るように、GStreamerのエレメントも引数を取ることができます。この引数は、「プロパティ」と呼ばれます。

各エレメントは、データの入出力の口となる「パッド(pad)」を持っています。実際にエレメント同士を繋いでいるのはパッドです。パッドにはデータを次のエレメントに渡す「ソースパッド(source pad)」とデータを受け取る「シンクパッド(sink pad)」が存在します。図中の「src 」と書かれた小さな箱と「sink 」と書かれた小さな箱がそれぞれに該当します。

パッドは自分が出力可能な、または入力可能なフォーマットを知っています。これを「ケイパビリティー (Capability)」と言います。パッドは、パイプラインが作られる時に繋がる相手パッドが持っているケイパビリティーを確認します。お互いのケイバビリティーが一致しない場合はデータの受け渡しができませんので、エラーとなり、最終的にパイプライン生成自体がエラーとなります。

ソースパッドしか持たないエレメントを「ソースエレメント」、シンクパッドしか持たないエレメントを「シンクエレメント」と呼びます。図中左端にある「filesrc0」がソースエレメントで、右端の「alsasink0」「acmfbdevsink」の2 つがシンクエレメントになります。マルチメディアデータは、一番左側のソースエレメントから右端のシンクエレメントに流れることで形を変えていき、最終的に動画や音声として再生されることになります。

上記例は、GStreamerのデバッグ/プロトタイピング用のコマンドラインツールであるgst-launch-1.0を使って説明しましたが、GStreamerはライブラリとして提供されているため、GStreamerを使ったマルチメディア機能を自作のアプリケーションプログラムに組み込むことができます。APIやアプリケーション開発マニュアルは、gstreamer.freedesktop.orgのDocumentationページ[http://gstreamer.freedesktop.org/documentation/]から参照することができます。

AVコーデックミドルウェア用のエレメントには、下記のものがあります[29]。以降の章では、これらのエレメントの使い方を中心に説明します。

  • H.264デコーダー: acmh264dec

  • AACデコーダー: acmaacdec

  • H.264エンコーダー: acmh264enc

  • AACエンコーダー: acmaacenc

  • JPEGエンコーダー: acmjpegenc

  • フレームバッファ用シンクエレメント: acmfbdevsink

環境にインストールされているエレメント一覧を取得したり、各エレメントの取れるケイパビリティや指定可能なプロパティはgst-inspect-1.0コマンドを使うことで調べることができます。

[armadillo ~]# gst-inspect-1.0
acmaacdec:  acmaacdec: ACM AAC audio decoder
acmh264enc:  acmh264enc: ACM H264 video encoder
acmfbdevsink:  acmfbdevsink: ACM fbdev video sink
acmh264dec:  acmh264dec: ACM H264 video decoder
acmaacenc:  acmaacenc: ACM AAC audio encoder
acmjpegenc:  acmjpegenc: ACM Jpeg encoder
video4linux2:  v4l2radio: Radio (video4linux2) Tuner
video4linux2:  v4l2sink: Video (video4linux2) Sink
video4linux2:  v4l2src: Video (video4linux2) Source
fbdevsink:  fbdevsink: fbdev video sink
udp:  udpsink: UDP packet sender
udp:  multiudpsink: UDP packet sender
udp:  dynudpsink: UDP packet sender
udp:  udpsrc: UDP packet receiver
(省略)

図15.6 エレメント一覧の取得


[armadillo ~]# gst-inspect-1.0 acmh264dec
Factory Details:
  Rank:         primary (256)
  Long-name:            ACM H264 video decoder
  Klass:                Codec/Decoder/Video
  Description:          ACM H.264/AVC decoder
  Author:               Atmark Techno, Inc.

Plugin Details:
  Name:                 acmh264dec
  Description:          ACM H264 Decoder
  Filename:             /usr/lib/gstreamer-1.0/libgstacmh264dec.so
  Version:              1.0.0
  License:              LGPL
  Source module:        gst-plugins-acm
  Binary package:       GStreamer ACM Plugins
  Origin URL:           http://armadillo.atmark-techno.com/

GObject
 +----GInitiallyUnowned
       +----GstObject
             +----GstElement
                   +----GstVideoDecoder
                         +----GstAcmH264Dec

Pad Templates:
  SINK template: 'sink'
    Availability: Always
    Capabilities:
      video/x-h264
          stream-format: avc
              alignment: au
                  width: [ 80, 1920 ]
                 height: [ 80, 1080 ]
              framerate: [ 0/1, 2147483647/1 ]

  SRC template: 'src'
    Availability: Always
    Capabilities:
      video/x-raw
                 format: RGB16
                  width: [ 80, 1920 ]
                 height: [ 80, 1080 ]
              framerate: [ 0/1, 2147483647/1 ]
      video/x-raw
                 format: RGB
                  width: [ 80, 1920 ]
                 height: [ 80, 1080 ]
              framerate: [ 0/1, 2147483647/1 ]
      video/x-raw
                 format: RGBx
                  width: [ 80, 1920 ]
                 height: [ 80, 1080 ]
              framerate: [ 0/1, 2147483647/1 ]
      video/x-raw
                 format: NV12
                  width: [ 80, 1920 ]
                 height: [ 80, 1080 ]
              framerate: [ 0/1, 2147483647/1 ]


Element Flags:
  no flags set

Element Implementation:
  Has change_state() function: gst_video_decoder_change_state

Element has no clocking capabilities.
Element has no indexing capabilities.
Element has no URI handling capabilities.

Pads:
  SINK: 'sink'
    Implementation:
      Has chainfunc(): gst_video_decoder_chain
      Has custom eventfunc(): gst_video_decoder_sink_event
      Has custom queryfunc(): gst_video_decoder_sink_query
      Has custom iterintlinkfunc(): gst_pad_iterate_internal_links_default
    Pad Template: 'sink'
  SRC: 'src'
    Implementation:
      Has custom eventfunc(): gst_video_decoder_src_event
      Has custom queryfunc(): gst_video_decoder_src_query
      Has custom iterintlinkfunc(): gst_pad_iterate_internal_links_default
    Pad Template: 'src'

Element Properties:
  name                : The name of the object
                        flags: readable, writable
                        String. Default: "acmh264dec0"
  parent              : The parent of the object
                        flags: readable, writable
                        Object of type "GstObject"
  device              : The video device eg: /dev/video0
                        flags: readable, writable
                        String. Default: null
  stride              : Stride of output video. (0 is unspecified)
                        flags: readable, writable
                        Unsigned Integer. Range: 0 - 65535 Default: 0
  x-offset            : X Offset of output video. (0 is unspecified)
                        flags: readable, writable
                        Unsigned Integer. Range: 0 - 65535 Default: 0
  y-offset            : Y Offset of output video. (0 is unspecified)
                        flags: readable, writable
                        Unsigned Integer. Range: 0 - 65535 Default: 0
  buf-pic-cnt         : Number of buffering picture
                        flags: readable, writable
                        Unsigned Integer. Range: 2 - 145 Default: 17
  enable-vio6         : FALSE: disable, TRUE: enable
                        flags: readable, writable
                        Boolean. Default: true

図15.7 エレメント情報の取得


15.4. 有効化/無効化

AVコーデックミドルウェアは、SHで動作するファームウェアと、Linux上で動作するデバイスドライバが協調して機能します。そのため、AVコーデックミドルウェアを有効化するには、SHにファームウェアをロードさせた後、ドライバをロードする必要があります。

SHファームウェアのロードとドライバのロードを行うには、/sys/devices/platform/acm.0/codecに"encoder"または"decoder"という文字列を書き込みます。AVコーデックミドルウェアを無効化する場合は、"none"という文字列を書き込みます。

[armadillo ~]# echo encoder > /sys/devices/platform/acm.0/codec
acm_h264enc: H.264 Encoder of AV Codec Middleware
acm_aacenc: AAC Encoder of AV Coenc Middleware
acm_jpegenc: JPEG Encoder of AV Codec Middleware

図15.8 AVコーデックミドルウェアの有効化(エンコーダー)


[armadillo ~]# echo decoder > /sys/devices/platform/acm.0/codec
acm_h264dec: H.264 Decoder of AV Codec Middleware
acm_aacdec: AAC Decoder of AV Codec Middleware

図15.9 AVコーデックミドルウェアの有効化(デコーダー)


[armadillo ~]# echo none > /sys/devices/platform/acm.0/codec

図15.10 AVコーデックミドルウェアの無効化


標準状態では、起動時に/etc/config/rc.localでAVコーデックミドルウェアを有効化しています。Armadillo-810の場合エンコーダーが、Armadillo-840の場合はデコーダーが有効になります。詳細は「/etc/config/rc.local」を参照してください。

AVコーデックミドルウェアの現在の状態は、/sys/devices/platform/acm.0/codecを読み出すことで確認できます。

[armadillo ~]# cat /sys/devices/platform/acm.0/codec
decoder [encoder] none

図15.11 AVコーデックミドルウェアの状態確認(エンコーダーが有効化されている場合)


[armadillo ~]# cat /sys/devices/platform/acm.0/codec
[decoder] encoder none

図15.12 AVコーデックミドルウェアの状態確認(デコーダーが有効化されている場合)


[armadillo ~]# cat /sys/devices/platform/acm.0/codec
decoder encoder [none]

図15.13 AVコーデックミドルウェアの状態確認(無効化されている場合)


15.5. デコード

15.5.1. コンテナの扱い

ビデオ(映像)とオーディオ(音声)データを一つのファイルにまとめる(多重化する)ためのフォーマットをコンテナフォーマットと言います。H.264/AVCとAACを格納可能なコンテナフォーマットには、MP4(MPEG-4 Part 14)、AVI(Audio Video Interface)、Matroskaなどがあります。また、MPEG2 TS(MPEG-2 Transport Stream)やMPEG2 PS(MPEG-2 Program Stream)は、拡張規格でH.264/AVCとAACに対応しています。

GStreamerでは、コンテナに格納されたビデオやオーディオのデータを取り出す場合、デマルチプレクサエレメントを使用します。

MP4コンテナからビデオとオーディオを取り出し再生するパイプラインの例として、図15.4「GStreamerの実行例」で示したコマンドラインを再掲します。MP4コンテナからビデオやオーディオを取り出す場合、qtdemuxエレメントを使用します。

[armadillo ~]# gst-launch-1.0 filesrc location=/mnt/big-buck-bunny-30sec-fullhd.mp4 \
 ! qtdemux name=demux0 \
 demux0.audio_0 ! queue ! acmaacdec ! audioresample ! audio/x-raw,rate=48000,channels=2 ! alsasink \
 demux0.video_0 ! queue ! acmh264dec ! acmfbdevsink device=/dev/fb0

図15.14 ビデオとオーディオを再生する


qtdemuxエレメントは、MP4コンテナに格納されているデータストリームごとに動的にソースパッドを作成します。ビデオ用に動的に生成されたパッドにはvideo_Nという名前が、オーディオ用に生成されたパッドにはaudio_Nという名前がつきます。

パッド名は省略して、下記のように記述することもできます。GStreamerでは、エレメント同士を接続(リンク)する際に、お互いのソースパッド(出力)とシンクパッド(入力)が受け渡しできるフォーマット(ケイパビリティ)が一致するかネゴシエーションを行い、ケイパビリティが一致した場合だけパッドがリンクされます。queueエレメントはバッファリングを行うためのエレメントで、どのようなフォーマットのデータも受け渡しでき、シンクパッドとソースパッドのケイパビリティは同じものになります。そのため、qtdemuxが動的に生成したオーディオ用のパッドにはオーディオを扱うacmaacdecにリンクされているqueueエレメントのシンクパッドが、ビデオ用のパッドにはビデオを扱うacmh264decエレメントがリンクされているqueueエレメントのシンクパッドがリンクされます。

[armadillo ~]# gst-launch-1.0 filesrc location=/mnt/big-buck-bunny-30sec-fullhd.mp4 \
 ! qtdemux name=demux0 \
 demux0. ! queue ! acmaacdec ! audioresample ! audio/x-raw,rate=48000,channels=2 ! alsasink \
 demux0. ! queue ! acmh264dec ! acmfbdevsink device=/dev/fb0

図15.15 ビデオとオーディオを再生する(パッド名の省略)


ビデオだけやオーディオだけを再生したい場合は、下記のように書くこともできます。この場合、qtdemuxのnameプロパティも省略されていますが、qtdemuxが動的に生成したパッドのうち、後続するエレメントが受け取れるパッドだけがリンクした状態となります。

[armadillo ~]# gst-launch-1.0 filesrc location=/mnt/big-buck-bunny-30sec-fullhd.mp4 ! qtdemux \
! queue ! acmh264dec ! acmfbdevsink

図15.16 ビデオのみ再生する


[armadillo ~]# gst-launch-1.0 filesrc location=/mnt/big-buck-bunny-30sec-fullhd.mp4 ! qtdemux \
! queue ! acmaacdec ! audioresample ! audio/x-raw,rate=48000,channels=2 ! alsasink

図15.17 オーディオのみ再生する


15.5.2. ビデオのデコード

15.5.2.1. 出力先を指定する

ビデオの出力先は、acmfbdevsinkのdeviceプロパティにフレームバッファのデバイスファイル名を指定することで変更できます。deviceプロパティを指定しなかった場合、/dev/fb0を使用します。

[armadillo ~]# gst-launch-1.0 filesrc location=/mnt/big-buck-bunny-30sec-fullhd.mp4 ! qtdemux \
 ! queue ! acmh264dec ! acmfbdevsink device=/dev/fb0

図15.18 ビデオを再生しHDMIディスプレイに表示する


[armadillo ~]# gst-launch-1.0 filesrc location=/mnt/big-buck-bunny-30sec-800x480.mp4 ! qtdemux \
 ! queue ! acmh264dec ! acmfbdevsink device=/dev/fb1

図15.19 ビデオを再生しLCDに表示する


15.5.2.2. 拡大/縮小する

acmh264decエレメントの出力側ケイパビリティにwidthとheightを指定することで、デコードした画像を拡大/縮小して表示することもできます。800×480サイズのビデオをFull HDサイズに拡大して表示する場合のパイプラインは図15.20「ビデオを拡大する」となります。

[armadillo ~]# gst-launch-1.0 filesrc location=/mnt/big-buck-bunny-30sec-800x480.mp4 ! qtdemux \
 ! queue ! acmh264dec ! video/x-raw,width=1920,height=1080 ! acmfbdevsink device=/dev/fb0

図15.20 ビデオを拡大する


同様に、縮小して表示することもできます。acmh264decは、出力側のケイパビリティに合わせてR-Mobile A1のVIOを使用して出力画像の拡大/縮小を行うため、ARM CPU側の負荷なく拡大/縮小を行うことができます。

[armadillo ~]# gst-launch-1.0 filesrc location=/mnt/big-buck-bunny-30sec-fullhd.mp4 ! qtdemux \
 ! queue ! acmh264dec ! video/x-raw,width=800,height=480 ! acmfbdevsink device=/dev/fb1

図15.21 ビデオを縮小する


15.5.2.3. 表示位置の指定

大きなディスプレイに小さな動画を表示したい場合など、出力画像と表示するディスプレイの幅が一致していない場合、acmh264decエレメントのstrideプロパティを指定する必要があります。800×480サイズの動画をそのままのサイズでFull HDサイズのHDMIディスプレイに表示する場合は、下記のコマンドになります。strideには出力先の幅を指定してください。

[armadillo ~]# gst-launch-1.0 filesrc location=/mnt/big-buck-bunny-30sec-800x480.mp4 ! qtdemux \
 ! queue ! acmh264dec stride=1920 ! acmfbdevsink device=/dev/fb0

図15.22 小さな動画を大きなディスプレイに表示する


x-offsetとy-offsetプロパティを使うことで、任意の位置に画像を表示することもできます。下記のコマンドを実行すると、Full HDサイズのディスプレイの右下に800×480サイズの動画が表示されます。

[armadillo ~]# gst-launch-1.0 filesrc location=/mnt/big-buck-bunny-30sec-800x480.mp4 ! qtdemux \
 ! queue ! acmh264dec stride=1920 x-offset=1120 y-offset=600 ! acmfbdevsink device=/dev/fb0

図15.23 オフセットを指定して任意の位置に表示する


stride、x-offset、y-offsetの関係を図15.24「ストライドとオフセットの関係」に示します。Full HDサイズのディスプレイの右下に800×480サイズの動画を表示する場合、x-offset=1920-800=1120、y-offset=1080-480=600として計算できます。

ストライドとオフセットの関係

図15.24 ストライドとオフセットの関係


15.5.3. オーディオのデコード

15.5.3.1. 出力先を指定する

オーディオの出力先は、alsasinkのdeviceプロパティにALSAデバイス名を指定することで変更できます。deviceプロパティを指定しなかった場合、hw:0を使用します。

[armadillo ~]# gst-launch-1.0 filesrc location=/mnt/big-buck-bunny-30sec-fullhd.mp4 ! qtdemux \
 ! queue ! acmaacdec ! alsasink device=hw:0

図15.25 オーディオをHDMIオーディオインターフェース(Armadillo-840: CON3)に出力する


[armadillo ~]# gst-launch-1.0 filesrc location=/mnt/big-buck-bunny-30sec-fullhd.mp4 ! qtdemux \
 ! queue ! acmaacdec ! alsasink device=hw:1

図15.26 オーディオをステレオヘッドホン出力インターフェース(拡張ボード01: CON6)に出力する


15.5.3.2. オーディオフォーマットの変換

Armadillo-840のHDMIオーディオインターフェース(Armadillo-840: CON3)は、signed 16bit little endian、interleaved、48kHz、2ch PCMのみ出力可能です。入力ファイルに含まれるオーディオがそれ以外のフォーマットやサンプリング周波数の場合、変換して出力する必要があります。オーディオフォーマットの変換にはaudioconvertエレメントを、サンプリング周波数の変換にはaudioresampleエレメントを使います。

[armadillo ~]# gst-launch-1.0 filesrc location=sample.mp4 ! qtdemux \
 ! queue ! acmaacdec ! audioconvert ! audioresample \
 ! audio/x-raw,format=S16LE,layout=interleaved,rate=48000,channels=2 \
 ! alsasink device=hw:1

図15.27 オーディオフォーマットを変換する


15.6. エンコード

15.6.1. コンテナの扱い

ビデオ(映像)とオーディオ(音声)データを一つのファイルにまとめる(多重化する)ためのフォーマットをコンテナフォーマットと言います。H.264/AVCとAACを格納可能なコンテナフォーマットには、MP4(MPEG-4 Part 14)、AVI(Audio Video Interface)、Matroskaなどがあります。また、MPEG2 TS(MPEG-2 Transport Stream)やMPEG2 PS(MPEG-2 Program Stream)は、拡張規格でH.264/AVCとAACに対応しています。

GStreamerでは、ビデオやオーディオのデータをコンテナに格納する場合、マルチプレクサエレメントを使用します。

ビデオのみをMP4コンテナに格納するパイプラインの例を図15.28「ビデオをエンコードしてコンテナに格納する」に示します。MP4コンテナに格納する場合、qtmuxエレメントを使用します。

[armadillo ~]# gst-launch-1.0 -e videotestsrc \
 ! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 \
 ! acmh264enc ! queue \
 ! qtmux ! filesink location=/mnt/output.mp4

図15.28 ビデオをエンコードしてコンテナに格納する


画像の入力ソースとして、様々なパターンの画像を様々なフォーマットで生成できるvideotestsrcを使用しています。acmh264encエレメントは、入力フォーマットとしてNV12形式のみを受付ますので、acmh264encの入力側のケイパビリティを指定しています[30]。videotestsrcは指定されたフォーマットで画像を出力します。

また、パイプライン停止時にEOSイベントを発行するように、gst-launch-1.0コマンドに-eオプションを付けています。エンコードを終了するには、Ctrl-Cでgst-launch-1.0コマンドを停止してください。

オーディオのみをMP4コンテナに格納するパイプラインの例を図15.29「オーディオをエンコードしてコンテナに格納する」に示します。ここでも、様々なパターンのオーディオデータを生成できるaudiotestsrcを使用しています。audiotestsrcが出力するフォーマットと、acmaacencが受け付けられるフォーマットを合わせるため、ケイパビリティを指定しているのはビデオの場合と同じです。

[armadillo ~]# gst-launch-1.0 -e audiotestsrc wave=sine freq=1000 \
 ! audio/x-raw,format=S16LE,layout=interleaved,rate=48000,channels=2 \
 ! acmaacenc ! queue \
 ! qtmux ! filesink location=/mnt/output.mp4

図15.29 オーディオをエンコードしてコンテナに格納する


ビデオとオーディオを同時にMP4コンテナに格納するパイプラインの例を図15.30「ビデオとオーディオをエンコードしてコンテナに格納する」に示します。

[armadillo ~]# gst-launch-1.0 -e videotestsrc \
 ! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 \
 ! acmh264enc ! queue ! muxer.video_0 \
 audiotestsrc wave=sine freq=1000 \
 ! audio/x-raw,format=S16LE,layout=interleaved,rate=48000,channels=2 \
 ! acmaacenc ! queue ! muxer.audio_0 \
 qtmux name="muxer" ! filesink location=/mnt/output.mp4

図15.30 ビデオとオーディオをエンコードしてコンテナに格納する


qtmuxエレメントは、入力されるビデオとオーディオそれぞれに対して、動的にシンクパッドを作成します。ビデオ用に動的に生成されたパッドにはvideo_Nという名前が、オーディオ用に生成されたパッドにはaudio_Nという名前がつきます。

パッド名は省略して、下記のように記述することもできます。GStreamerでは、エレメント同士を接続(リンク)する際に、お互いのソースパッド(出力)とシンクパッド(入力)が受け渡しできるフォーマット(ケイパビリティ)が一致するかネゴシエーションを行い、ケイパビリティが一致した場合だけパッドがリンクされます。queueエレメントはバッファリングを行うためのエレメントで、どのようなフォーマットのデータも受け渡しでき、シンクパッドとソースパッドのケイパビリティは同じものになります。そのため、qtmuxが動的に生成したオーディオ用のパッドにはオーディオを扱うacmaacencにリンクされているqueueエレメントのソースパッドが、ビデオ用のパッドにはビデオを扱うacmh264encエレメントがリンクされているqueueエレメントのソースシンクパッドがリンクされます。

[armadillo ~]# gst-launch-1.0 -e videotestsrc \
 ! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 \
 ! acmh264enc ! queue ! muxer. \
 audiotestsrc wave=sine freq=1000 \
 ! audio/x-raw,format=S16LE,layout=interleaved,rate=48000,channels=2 \
 ! acmaacenc ! queue ! muxer. \
 qtmux name="muxer" ! filesink location=/mnt/output.mp4

図15.31 ビデオとオーディオをエンコードしてコンテナに格納する(パッド名の省略)


15.6.2. ビデオのエンコード

15.6.2.1. 入力ソースを指定する

v4l2srcエレメントを使うことで、V4L2(Video for Linux 2)デバイスとして実装されているカメラデバイスから画像を取得できます。どのデバイスから画像を取得するかは、v4l2srcエレメントのdeviceプロパティにデバイスファイル名を指定することで変更できます。Armadillo-810 カメラモデルの場合、Armadillo-810 カメラモジュール01 (Bコネクタ用)のデバイスファイルは/dev/video1となります。

[armadillo ~]# gst-launch-1.0 -e v4l2src device="/dev/video1" \
 ! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 \
 ! acmh264enc ! queue \
 ! qtmux ! filesink location=/mnt/output.mp4

図15.32 カメラモジュールからの入力画像をエンコードする


UVC対応USBカメラなども同様にv4l2srcで扱うことができます。どのデバイスファイルが、どのカメラに対応しているかは/sys/class/video4linux/videoN/nameで確認できます。Armadillo-810 カメラモジュールなど、R-Mobile A1のCEUに接続されたカメラの場合、"sh_mobile_ceu.N"と表示されます。UVC対応USBカメラの場合、"USB Camera"などと表示されます。

[armadillo ~]# cat /sys/class/video4linux/video0/name
sh_mobile_ceu.0
[armadillo ~]# cat /sys/class/video4linux/video4/name
USB Camera

図15.33 どのデバイスファイルがどのカメラに対応しているか確認する


USBカメラによってはNV12フォーマットで出力できない場合もあります。そのような場合は、videoconvertエレメントを使うことで画像フォーマットを変更できます。

[armadillo ~]# gst-launch-1.0 -e v4l2src device="/dev/video4" \
 ! videoconvert ! video/x-raw,format=NV12,framerate=30/1 \
 ! acmh264enc ! queue \
 ! qtmux ! filesink location=/mnt/output.mp4

図15.34 USBカメラからの入力画像をエンコードする


15.6.2.2. フレームレートを指定する

Armadillo-810 カメラモジュール01 (Bコネクタ用)からの入力画像は、30fps固定となっています。しかし、そこまでフレームレートが必要ない場合、もっと低いフレームレートでエンコードすることもできます。フレームレートの変更には、videorateエレメントを使います。図15.35「フレームレートを指定する」のように指定すると、15fpsでエンコードを行います。

[armadillo ~]# gst-launch-1.0 -e v4l2src device="/dev/video1" \
 ! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 \
 ! videorate ! video/x-raw,framerate=15/1 \
 ! acmh264enc ! queue \
 ! qtmux ! filesink location=/mnt/output.mp4

図15.35 フレームレートを指定する


15.6.2.3. エンコード品質を指定する

acmh264encエレメントのプロパティを指定することで、エンコード品質を調整できます。エンコード品質に影響するacmh264encエレメントのプロパティを下記に示します。

表15.5 エンコード品質に影響するacmh264encエレメントのプロパティ

プロパティ意味最小値最大値デフォルト値

bitrate

目標平均ビットレート[bit/sec]

16,000

40,000,000

8,000,000

max-frame-size

最大フレームサイズ[a][byte]

0

5,000,000

0(推奨値[b]を使用)

rate-control-mode

  • 0: 固定ビットレート(ピクチャスキップあり)

  • 1: 固定ビットレート(ピクチャスキップなし)

  • 2: 可変ビットレート(ピクチャスキップなし)

0

2

2

max-gop-length

最大GOP長

  • 0: ストリームの先頭のみIピクチャ

  • 1: 全てIピクチャ

  • 2以上: 指定されたGOP長でGOPを生成

0

120

30

b-pic-mode

Bピクチャモード

  • 0: Bピクチャを使用しない

  • 1~3: BピクチャをNフレーム挿入[c]

0

3

3

[a] 0以外を指定する場合は、目標平均ビットレート/8[byte]以上を指定すること

[b] 固定ビットレート制御時: 目標平均ビットレート/3*4/8[byte]、可変ビットレート制御時: 目標平均ビットレート*2/8[byte]

[c] Bピクチャを挿入する場合、rate-control-mode=0(ピクチャスキップあり)は指定不可


15.6.2.4. 入力画像サイズの制限とオフセットの指定

acmh264encエレメントへの入力画像サイズには、下記の制限があります。

  • 入力画像幅: 80~1920画素(2の倍数であること)

  • 入力画像高さ: 80~1088ライン(2の倍数であること)

  • 入力画像幅 × 入力画像高さは32の倍数であること

また、acmh264encエレメントのx-offsetプロパティとy-offsetプロパティを使うことで、入力画像の一部だけをエンコードできます。x-offsetとy-offsetプロパティには下記の制限があります。

  • [入力画像幅]×[y-offset]+[x-offset]は32の倍数であること

  • [入力画像幅]×[y-offset]/2+[x-offset]は32の倍数であること

図15.36「オフセットを指定する」のように指定すると、640×480サイズの入力画像のうち、中央の320×240サイズだけエンコードを行います。acmh264encエレメントの出力サイズを設定するために、出力側のケイパビリティも指定している点に注意してください。

[armadillo ~]# gst-launch-1.0 -e videotestsrc \
 ! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 \
 ! acmh264enc x-offset=160 y-offset=120 ! video/x-h264,width=320,height=240 ! queue \
 ! qtmux name="muxer" ! filesink location=output.mp4

図15.36 オフセットを指定する


15.6.3. オーディオのエンコード

15.6.3.1. 入力ソースを指定する

alsasrcエレメントを使うことで、ALSA(Advanced Linux Sound Architecture)デバイスとして実装されているオーディオデバイスから録音できます。どのデバイスから音声を取得するかは、alsasrcエレメントのdeviceプロパティにALSAデバイス名を指定することで変更できます。Armadillo-840 液晶モデルの場合、Armadillo-840 拡張ボード01 (Cコネクタ用)のマイク入力インターフェース(CON5)に対応するALSAデバイスはhw:1となります。

[armadillo ~]# gst-launch-1.0 -e alsasrc device="hw:1" \
 ! audio/x-raw,format=S16LE,layout=interleaved,rate=48000,channels=2 \
 ! acmaacenc ! queue \
 ! qtmux ! filesink location=/mnt/output.mp4

図15.37 マイク入力インターフェースからの入力音声をエンコードする


音声入力となることができるALSAデバイスの一覧は、 arecord -lコマンドで調べられます。card Nの番号を、alsasrcのdeviceプロパティに指定してください。

[armadillo ~]# arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: FSI2AWM8978 [FSI2A-WM8978], device 0: wm8978 wm8978-hifi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: Camera [USB Camera], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

図15.38 ALSA入力デバイスの一覧表示


15.6.3.2. エンコード品質を指定する

acmaacencエレメントのプロパティを指定することで、エンコード品質を調整できます。エンコード品質に影響するacmaacencエレメントのプロパティを下記に示します。

表15.6 エンコード品質に影響するacmaacencエレメントのプロパティ

プロパティ意味最小値最大値デフォルト値

bitrate

目標平均ビットレート[bit/sec]

16,000

288,000

64,000

enable-cbr

固定ビットレート有効

  • 0: 可変ビットレート

  • 1: 固定ビットレート

0

1

0


15.6.4. JPEGのエンコード

15.6.4.1. JPEGをファイルに保存する

Armadillo-810 カメラモジュール01 (Bコネクタ用)のカメラデバイスから取得した画像をJPEGとして保存する場合、下記コマンドを実行します。10フレームの画像を取得し、output0.jpeg ~ output9.jpeg の10枚のJPEG画像が生成されます。画像取得開始からカメラのAGC(Auto Gain Control)、AWB(Auto White Balance)の効果が十分に反映されるまでに 6 フレーム程度かかりますので、output0.jpeg ~ output5.jpeg は色合い、明るさが激しく変化します。

最後の 1 フレームだけ取得したい場合は、 multifilesinkエレメントにmax-files=1プロパティを指定してください。

[armadillo ~]# gst-launch-1.0 -e v4l2src device=/dev/video1 num-buffers=10 \
 ! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 \
 ! acmjpegenc ! multifilesink location=/mnt/output%d.jpeg

図15.39 カメラモジュールからの入力画像をエンコードする


下記コマンドを実行すると、JPEGエンコードした画像をMotion JPEGとしてmovファイルに格納することができます。

[armadillo ~]# gst-launch-1.0 -e v4l2src device=/dev/video1 \
 ! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 \
 ! acmjpegenc ! qtmux ! filesink location=/mnt/output.mov

図15.40 Motion JPEGとしてファイルに保存する


15.6.4.2. エンコード品質を指定する

acmjpegencエレメントのqualityプロパティを指定することで、エンコード品質を調整できます。0~100でエンコード品質を指定します。値が小さいほど画像が荒くなりますが、画像サイズは小さくなります。デフォルト値は75に設定されています。

15.6.4.3. 入出力画像サイズの制限とオフセットの指定

acmjpegencエレメントへの入出力画像サイズには、下記の制限があります。

  • 入力画像幅: 16~1920画素(8の倍数であること)

  • 入力画像高さ: 16~1072ライン(16の倍数であること)

  • 出力画像幅: 16~1920画素(4の倍数であること)

  • 出力画像高さ: 16~1072ライン(4の倍数であること)

また、acmjpegencエレメントのx-offsetプロパティとy-offsetプロパティを使うことで、入力画像の一部だけをエンコードできます。x-offsetとy-offsetプロパティには、下記の制限があります。

  • [入力画像高さ]-[y-offset]が16の倍数であること

図15.41「オフセットを指定する」のように指定すると、640×480サイズの入力画像のうち、中央の320×240サイズだけエンコードを行います。ajpegencエレメントの出力サイズを設定するために、出力側のケイパビリティも指定している点に注意してください。

[armadillo ~]# gst-launch-1.0 -e videotestsrc num-buffers=10 \
 ! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 \
 ! acmjpegenc x-offset=160 y-offset=112 ! image/jpeg,width=320,height=240 \
 ! multifilesink location=/mnt/output%d.jpeg

図15.41 オフセットを指定する




[29] Armadillo-800シリーズ用の環境では、NEON対応したlibjpeg turboが導入されています。libjpeg turboを使うことで十分に高速なJPEGデコードを行うことができるため、AVコーデックミドルウェアにはJPEGデコーダーは含まれていません。

[30] エレメントが受け付けられるフォーマットは、gst-inspect-1.0を実行したときの"SINK template"の"Capabilities"で確認できます。