問題タブ [video-toolbox]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - CMVideoFormatDescriptionCreateFromH264ParameterSets in Swift
CoreMedia/Video Toolbox API は、Swift で私を混乱させる多くのポインターを使用します!
SPS、PPS データは h264 ストリームから取得されたもので、そのための VFD を作成しようとしています。
以下を試してみましたが、うまくいくと思っていましたが、-12710 エラー (kCMFormatDescriptionError_InvalidParameter = -12710) が発生しました。
これが私の遊び場です..私は何を間違っていますか??
ios - VTCompressionSessionEncodeFrame エラー コード -12902
CVImageBufferRef を受け取り、処理のために VTCompressionSession に渡す関数があります。
VTCompressionSession が開始され、VTCompressionSessionCreate への呼び出しが成功しました。
写真ライブラリからビデオ URL を取得し、次を使用して処理しています。
ブロックは基本的に呼び出すだけです
ステータスは -12902 です。このサイトでステータスに関する情報を調べましたが、他に関連する情報は見つかりませんでした。サイトによると、エラーはkVTParameterErr
.
VTCompressionOutputCallback が呼び出されていません。
このエラーコードを説明できる人はいますか?
ios - AVSampleBufferDisplayLayer がサンプル バッファをレンダリングする速度を設定します
AVSampleBufferDisplayLayer を使用して、h.264 形式でネットワーク接続を介して送信される CMSampleBuffers を表示しています。ビデオの再生はスムーズで正しく機能していますが、フレーム レートを制御できないようです。具体的には、AVSampleBufferDisplayLayer で毎秒 60 フレームをキューに入れると、ビデオが 30 FPS で記録されていても、60 フレームが表示されます。
サンプル バッファーを作成する場合、タイミング情報の配列を CMSampleBufferCreate に渡すことで、プレゼンテーションのタイム スタンプを設定できます (タイミング情報は h.264 ストリームには存在しませんが、コンテナー形式で計算または渡すことができます)。設定したプレゼンテーション タイム スタンプは約 0.033 秒間隔で、持続時間は 0.033 ですが、ディスプレイ レイヤーは 1 秒あたりのフレーム数を可能な限り表示します。
AVSampleBufferDisplayLayer でバッファーをキューに入れる方法は 2 つあります。バッファーの準備ができたら常に -[AVSampleBufferDisplayLayer enqueueSampleBuffer:] を呼び出して「制約」するか、-[AVSampleBufferDisplayLayer requestMediaDataWhenReadyOnQueue:usingBlock:] を呼び出してそのブロックのバッファーをキューに入れることで「制約なし」です。私は両方を試しましたが、2 番目の方法でもできるだけ早くバッファを表示します。バッファーはキューに入れられ、すべてが非常に短い時間で表示されます。
この動作は、kCMSampleAttachmentKey_DisplayImmediately 添付ファイルが CMSampleBuffer に設定されている場合に予想されるものと似ていますが、これは現在設定されていません (デフォルトは false です)。
レイヤーのcontrolTimeBaseを設定してみましたが、効果がないようでした。他に試してみるべきことがなく、オンラインで例を見つけることができませんでした。AVSampleBufferDisplayLayer がフレームを表示するフレームレートを制御する方法を知っている人はいますか?
video-streaming - VideoToolbox を使用せずに tvOS でハードウェア デコーディングにアクセスするにはどうすればよいですか?
VideoToolbox は tvOS では使用できないため、ビデオをデコードするにはどうすればよいですか?
メモリに h.264 のフレーム (ネットワーク経由でストリーム) があるアプリがあり、以前は VideoToolbox でデコードを処理していました。代わりは何ですか?
ios - iOSでCVImageBufferRefを表示する最も効率的な方法は何ですか?
フレームのデコードが完了した後に CVImageBufferRef になる VTDecompressionSessionDecodeFrame を使用してデコードする CMSampleBufferRef(s) があるので、私の質問は..
これらの CVImageBufferRefs を UIView に表示する最も効率的な方法は何でしょうか?
CVImageBufferRef を CGImageRef に変換し、CGImageRef を CALayer のコンテンツとして設定して表示することに成功しましたが、DecompressionSession は @{ (id)kCVPixelBufferPixelFormatTypeKey: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] }; で構成されています。
CVImageBufferRef を CGImageRef に変換した例/コードを次に示します (注: これを機能させるには、cvpixelbuffer データを 32BGRA 形式にする必要があります)。
#WWDC14 セッション 513 ( https://developer.apple.com/videos/wwdc/2014/#513 ) は、YUV -> RGB 色空間変換 (CPU を使用?) を回避できることを示唆しており、YUV 対応の GLES マジックが使用されている場合 -それが何であり、どのようにこれを達成できるのだろうか?
Apple の iOS SampleCode GLCameraRipple は、Y コンポーネントと UV コンポーネントに個別のテクスチャを持つ 2 つの OpenGLES と、GPU を使用して YUV から RGB 色空間への変換計算を行うフラグメント シェーダー プログラムを使用して、カメラからキャプチャされた YUV CVPixelBufferRef を表示する例を示しています。これを行うためのより簡単な方法はありますか?
注: 私の使用例では、解凍への入力がどのように利用可能になるかという事実のために、AVSampleBufferDisplayLayer を使用できません。
ios - MPEG トランスポート ストリームから H.264 NAL ユニットを抽出していますか?
iOS プラットフォームで MPEG トランスポート ストリームから H.264 NAL ユニットを抽出するにはどうすればよいですか? VideoToolbox または AVFoundation にこれを支援するものはありますか? 自分でストリームを解析する必要がありますか?
ios - VTDecompressionSession による画像バッファの表示順序
ライブ ネットワーク ストリームから h264 ビデオをデコードする必要があるプロジェクトがあり、最終的に iOS デバイスの別のフレームワーク (Unity3D) で表示できるテクスチャになります。VTDecompressionSession を使用してビデオを正常にデコードし、CVMetalTextureCacheCreateTextureFromImage (または OpenGL バリアント) を使用してテクスチャを取得できます。低レイテンシのエンコーダーを使用し、画像バッファーが表示順に表示される場合はうまく機能しますが、通常のエンコーダーを使用すると、画像バッファーは表示順に表示されず、画像バッファーの並べ替えは明らかにはるかに困難です。私は期待した。
最初の試みは、kVTDecodeFrame_EnableAsynchronousDecompression と kVTDecodeFrame_EnableTemporalProcessing を使用して VTDecodeFrameFlags を設定することでした...ただし、VTDecompressionSession はフラグを無視して、必要なことを実行することを選択できることがわかりました...そして私の場合、フラグを無視することを選択しても出力しますエンコーダー順のバッファー (表示順ではありません)。本質的に役に立たない。
次の試みは、イメージ バッファをプレゼンテーション タイム スタンプに関連付けてから、テクスチャを作成するときに必要なイメージ バッファを取得できるようにするベクトルにスローすることでした。問題は、タイム スタンプに関連付けられている VTDecompressionSession に入るイメージ バッファーが、出力されるバッファーと同じではなくなり、本質的にタイム スタンプが役に立たなくなることです。
たとえば、デコーダーに入ると...
コールバック側で...
順序付けされると、コールバック側のタイム スタンプは予想される速度で単調に増加しますが、バッファは正しい順序ではありません。ここで私がどこでエラーを起こしているのか誰にもわかりますか? または、コールバック側でバッファの順序を決定する方法を知っていますか? この時点で、考えられることはすべて試しました。
macos - Mac OS がハードウェア H264 エンコーダーを使用しない理由をデバッグする方法
H264 を使用してビデオのみのストリームをエンコードしようとしています。ハードウェア エンコーダーを使用して、ハードウェアと CPU のエンコード間の品質とリソース消費の両方を比較したいと考えています。問題は、OS にハードウェア エンコーダーを強制的に使用させることができないということです。
これは、VTCompressionSession を作成するために使用しているコードです。
コンソールを開いたところ、セッションを作成しようとしたときに表示される唯一の関連メッセージは次のとおりです。
これは、EncoderID を使用したときに取得するステータス コードです。
これは、EncoderID を使用しない場合に得られるものです。
どちらもリソースの可用性の欠如に関連していますが、違いは見つかりませんでした。ハードウェア エンコーダーを使用する可能性がある最もよく知られている機能がオフになっていることを確認しましたが、これを確認する方法がわかりません。AirPlay はオフ、QuickTime はオフ、カメラにアクセスするアプリはありません。
TL;DR: ハードウェア エンコーダーを有効にするために OS が使用している戦略を強制または知る方法はありますか?最終的には、いつでも使用できない理由を知ることができますか?
前もって感謝します!
ios - VTCompressionSessionEncodeFrame の後に H.264 AVC CMBlockBufferRef からモーション ベクトルを抽出する方法
1/30フレームCMBlockBufferRef
の表現を読んだり理解したりしようとしています。H.264 AVC
バッファとカプセル化CMSampleBufferRef
は を使用して作成されVTCompressionSessionRef
ます。
https://gist.github.com/petershine/de5e3d8487f4cfca0a1d
CMBlockBufferRef
H.264 データは、圧縮されたサンプルからのAVC メモリ バッファとして表されます。
もう一度完全に解凍せずに、これから抽出しようとしてmotion vectors or predictions
いますCMBlockBufferRef
。
最速のパフォーマンスを得るには、データ バッファーからのバイト単位の読み取りCMBlockBufferGetDataPointer()
が必要であると考えています。
ただし、データ バッファーを見つけて抽出するつもりで、データ バッファーを読み取る正しい方法を見つけるのに苦労していますmotion vectors or predictions
。
解凍したり、使用したりせずに、まったく方法はありませんffmpeg
か?