YUY2やMJPEGと同様にフォーマットディスクリプタとフレームディスクリプタを使う方法UVC1.1規格のフレームベースフォーマットでのH.264対応...例えばロジクールのC920rがこのタイプです。MJPEGのペイロードに埋め込んで転送する方法UVC1.1規格でのH.264対応...例えばロジクールのC930eがこのタイプです。UVC規格でのh.264対応は3通りありました。前回までに載せたのはこのうち一番古くからある3番めの方法です。備忘として前回(っていつやねん)も載せましたがMJPEGペイロードに多重化されたH.264映像の取得手順をもう一度載せておきます。MJPEGペイロードに多重化されたH.264映像の取得手順カメラと接続(ファイルオープン)するデバイスディスクリプタを解析。フォーマットディスクリプタとフレームディスクリプタからカメラが対応している映像フォーマット、解像度、フレームインターバル(フレームレート)等を取得するデバイスディスクリプタを解析。エクステンションユニットディスクリプタが存在する場合にはそれがH.264エクステンションユニットかどうかをguidExtensionCodeを使って確認する。configurationを問い合わせるH.264エクステンションユニットへネゴシエーションを行うこれによってMJPEGペイロードにH.264ペイロードが多重化されて転送されてくるようになります使用したい条件(MJPEG)をカメラとネゴシエーションするカメラから映像(MJPEG)を受け取るMJPEGペイロードを解析してH.264ペイロードを取り出す取り出したH.264ペイロードはよきにはからいたもうれ。表示するならごにょごにょしてからMediaCodecのデコーダーに放り込んでSurfaceへ描画させればOKです必要なだけ映像を受け取ったらカメラからの映像ストリームを停止するH.264エクステンションユニットの設定をクリアするカメラから切断(ファイルクローズ)する前回はUVC(1.1)機器がH.264に対応しているかどうか、また対応している場合の設定取得について書きました。今回は取得した情報を使ってH.264エクステンションユニットとネゴシエーションを行う方法についてです。H.264エクステンションユニットとネゴシエーションを行う方法すること自体はプルーブ&コミットクエリというおなじみに手順ですが、これはっきり言って超めんどいです。ここで見つかるのはh264が多重化されている時だけ。ここで見つかるのはh264が多重化されている時だけ。int);}</configh264>※currentH264Configは前回取得したuvcx_video_config_probe_commit_t構造体です。ここでキーとなるのはbStreamMuxOptionとbAuxUnitNumberです。bStreamMuxOptionはuvcx_video_config_probe_commit_tのフィールドで、H.264エキステンションユニットからの出力をどのようにして他のフレームデータ(MJPEGフレームデータ)と多重化させるかを指定します。これはネゴシエーション(プルーブ/コミットクエリ)中に必要になるのと、後でフレームデータを受け取った際に多重化されているかどうかをチェックして分岐させる時に使うので別途保持しておきます。bAuxUnitNumberはH.264エクステンションユニットのユニットIDです。別関数にするほどではないですが、H.264エクステンションユニットとのプルーブ/コミットクエリの部分はこんな感じにしています。最終的に行き着く先はdevice->query_configを呼ぶだけなのでMJPEGストリームの場合と同じですが、MJPEGの場合にはMJPEGストリーミングインターフェースのIDを使ってネゴシエーションしますがその代わりにH.264エクステンションユニットのユニットIDを使います。QPにするのが一番いいみたい。QPにするのが一番いいみたい。int);}どやっ、参ったか^^H.264エキステンションユニットに対するプルーブクエリと、対応するMJPEGストリームインターフェースに対するプルーブクエリの両方が成功すれば多重化H.264ストリームのネゴシエーションが半分ほど終わったことになります。後はH.264エキステンションユニットに対するコミットクエリと、対応するMJPEGストリームインターフェースに対するコミットクエリを行って両方が成功すればいよいよフレームデータの受信です。言っても受信自体はMJPEGでアイソクロナス転送のペイロード受信するのと同じなので省略です。違うのは、保存しておいたbStreamMuxOptionをチェックして多重化されていればMJPEGのフレームデータから多重化されているペイロードを抜き出す処理です。MJPEGフレームデータに多重化されたH.264ペイロードを抜き出す多重化されたH.264ペイロードはMJPEGのAPP4マーカーの直後のセグメントに入っています。設定が間違っているのかそもそもマーカーコールバックが呼ばれんのです。いう事でオレオレ実装してしまいました。JPEGフレームデータからJFIFマーカーを探す処理。線形探索するしかないのがボトルネックなのですが、JFIFの規格上APPxマーカーは必ずSOSマーカーよりも前に存在するのでSOSマーカー以降はスキップすることで速度向上を図っています。MUX_CONTAINER_MJPEGに対応したカメラ(...が有るかどうかは知りませんが)であれば、MJPEG関係のフラグメントは殆ど入っていないはずなのでもっと速く探索できるかもしれません。それ以外のマーカーはマーカー直後の2バイトがデータ部のサイズが入る(ビッグエンディアン)。それ以外のマーカーはマーカー直後の2バイトがデータ部のサイズが入る(ビッグエンディアン)。0xe4)を渡して呼び出して、APP4マーカーが見つかれば次のようにします。最初に見つかったAPP4マーカーの直後にペイロードヘッダーがついているはずですのでそれを取り出しますペイロードヘッダーに含まれるFOURCCをチェックしてH.264かどうかを確認しますAPP4マーカーとペイロードヘッダー分を差し引いてセグメント内のデータをコピーします2番目以降のAPPマーカーの場合はAPP4マーカー分を差し引いた残りをコピーしますコードにするとこないなことに。APP4マーカーは1つもMJPEGフレームデータ内に1つかもしれませんし複数存在するかもしれませんので、ループ中で繰り返し呼ぶことになります。int);}これでH.264ペイロードを抜き出すことが出来ました。ちなみにペイロードヘッダーはこのようになっています。uvc_payload_header_mux_t;多重化されている可能性のあるFOURCCは次の通り。それぞれが、「H.264エクステンションユニットとネゴシエーションを行う方法」のところのコードで#defineしてあるフラグに対応しています。};これでとりあえずは多重化されているフレームデータを取り出せたんで、このままネットに投げるとかなら簡単やねんけど、表示しようとか録画しようとかとなると、まだまだ色々する必要があります。reserved.%d人のブロガーが「いいね」をつけました。このサイトでは利便性の向上の為に、機能的なクッキーと外部スクリプトを使用しています。同意しますプライバシー設定広告プライバシー設定このサイトでは利便性の向上の為に、機能的なクッキーと外部スクリプトを使用しています。どのクッキーとスクリプトが使用され、どのように訪問に影響を与えるかを左に示します。設定はいつでも変更できます。あなたの選択はサイトへの訪問に悪い影響を与えません。これらの設定は、現在使用しているブラウザとデバイスにのみ適用されます。広告このサイトでは、サイトや広告を改善するためにCookieを利用することがあります。本サイトを利用することでCookieの仕様に同意するものとします。