問題タブ [cmsamplebufferref]
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 - CMSampleBufferRef から UIImage を作成中に iOS メモリが蓄積する
UIImage
からオブジェクトを作成していますCMSampleBufferRef
。私はこれを別のキューで (バックグラウンドで) 行っているので、処理を@autorealease
プールに含めています。問題は、メモリがリーク通知なしで構築されていることです。以下は私が使用している方法です:
そして、これが私がそれを使用している方法です:
ios - AVSampleBufferDisplayLayer が、AVCaptureVideoDataOutput のデリゲートから取得した CMSampleBuffers を表示しなくなるのはなぜですか?
AVSampleBufferDisplayLayer でいくつかの CMSampleBuffer を表示したいのですが、最初のサンプルを表示した後にフリーズします。
AVCaptureVideoDataOutputSampleBuffer デリゲートからサンプルバッファーを取得します。
それらをベクトルに入れます
次に、AVSampleBufferDisplayLayer (別の ViewController) を介してそれらを表示してみてください
しかし、最初のサンプルがフリーズし、何もしないことを示しています。
そして、私のビデオデータ出力設定は次のとおりです。
ios - AVSampleBufferDisplayLayer のビデオ ストリームがスクリーンショットに表示されない
新しい Video Toolbox メソッドを使用して、H.264 ビデオ ストリームを取得し、AVSampleBufferDisplayLayer
. これはすべて意図したとおりに機能し、ストリームは見栄えがします。 しかし、ビュー全体のスクリーンショットを撮ろうとすると、その内容AVSampleBufferDisplayLayer
(解凍されたビデオ ストリーム) がスナップショットに表示されません。 スナップショットには、他のすべての UI ボタン/ラベルなどが表示されます。しかし、スクリーンショットには (明るい青に設定した) 背景色のみが表示AVSampleBufferDisplayLayer
され、ライブ ビデオ フィードは表示されません。
以下のメソッド (この投稿に触発されたもの) ではSampleBuffer
、ストリームから を取得し、キューに表示するようにキューに入れますAVSampleBufferDisplayLayer
。次に、メソッドimageFromLayer:を呼び出して、スナップショットを として取得しUIImage
ます。(次に、その UIImage を UIImageView imageDisplay に表示するか、デバイスのローカル カメラ ロールに保存して、どのようにUIImage
見えるかを確認します。どちらの方法でも同じ結果が得られます。)
ここでは、 の内容を単純に取得して、AVSampleBufferDisplayLayer
に変換しようとしていUIImage
ます。画面全体をレイヤーとしてこのメソッドに渡すと、ラベル/ボタン/画像などの他のすべての UI 要素が表示されAVDisplayLayer
ます。だけを渡すと、AVDisplayLayer
青一色のイメージが得られます (背景色が青であるため)。
と を使用してみましUIImage snapshot = [self imageFromLayer: self.AVSampleDisplayLayer.presentationLayer];
た.modelLayer
が、役に立ちませんでした。サンプルバッファをキューに入れ、スナップショットを撮る前に待機しようとしました. の不透明度と xPosition をいじってみAVDisplayLayer
ましCMTimebase
たAVDisplayLayer
. どんなヒントでも大歓迎です!
ios - iOS の CMSampleBufferRef からカメラ データの現在のキャプチャされたタイムスタンプを取得する方法
キャプチャしたカメラ データをファイルに保存する iOS アプリケーションを開発し、使用しました。
CMSampleBufferRef をキャプチャすると、これが H264 形式にエンコードされ、フレームは を使用してファイルに保存されますAVAssetWriter
。
サンプル ソース コードに従って、このアプリを作成しました。
ここで、保存されたビデオ フレームのタイムスタンプを取得して、新しいムービー ファイルを作成したいと考えています。このために、私は次のことをしました
ファイルを見つけて作成
AVAssestReader
し、ファイルを読み取ります
印刷された値は間違ったタイムスタンプを与え、フレームのキャプチャ時間を取得する必要があります。
フレームキャプチャのタイムスタンプを取得する方法はありますか?
タイムスタンプを取得するための回答を読みましたが、上記の質問を適切に詳しく説明していません。
アップデート:
ファイルに書き込む前にサンプルのタイムスタンプを読んだところ、xxxxx
値が得られました ( 33333.23232
)。ファイルを読み取ろうとした後、別の値が得られました。これには具体的な理由はありますか??
swift - 正確な CMTime で AudioBuffer を CMSampleBuffer に変換する
ここでの目標は、AVCaptureDataOutput を介してビデオを介して mp4 ファイルを作成し、CoreAudio に記録されたオーディオを作成することです。次に、両方の CMSampleBuffers を、付随する AVAssetWriterInput(AVMediaTypeVideo) と AVAssetWriterInput(AVMediaTypeAudio) を持つ AVAssetWriter に送信します。
私のオーディオ エンコーダーは、AudioBuffer を新しい CMSampleBuffer にコピーし、それを AVAssetWriterInput(AVMediaTypeAudio) に渡します。この例は、AudioBuffer から CMSampleBuffer への変換がどのように行われるかを示しています。CMSampleBuffer への変換
要するに、それは機能しません。ビデオは表示されますが、音声は表示されません。
しかし、ビデオ エンコーディングをコメント アウトすると、オーディオがファイルに書き込まれ、聞こえるようになります。
これは、経験から、タイミングの問題であることがわかります。CMSampleBuffer への変換は示しています
{0/1 = 0.000}
それは私には完全に間違っているように見えるCMTimeCopyDescriptionを生成します。レンダリングされたフレームを追跡し、時間値のフレームカウントと時間スケールのサンプルレートをこのように渡してみました
しかし、サイコロはありません。見栄えの良い CMSampleTimingInfo{107520/44100 = 2.438}
ですが、ファイルにはまだ音声がありません。
ビデオ CMSampleBuffer は、このようなものを生成します{65792640630624/1000000000 = 65792.641, rounded}
。これは、AVCaptureVideoOutput のタイム スケールが 10 億、おそらくナノ秒であることを示しています。そして、時間値はデバイス時間のようなものです。AVCaptureVideoOutput が使用するものに関する情報が見つかりません。
誰にも役立つガイダンスはありますか?私は正しい軌道に乗っていますか?
変換はこちら
そして、私が作成するassetWriters
ios - .mov ファイルからの `CMSampleBufferRef` の作成
私のアプリはビデオ クリップを 3 秒間キャプチャします。プログラムで、記録された 3 秒のクリップから 5 回ループして 15 秒のクリップを作成したいと考えています。最後に、CameraRoll に 15 秒のクリップを保存する必要があります。
AVCaptureMovieFileOutput
経由で3 秒のビデオ クリップを取得しました。NSURL
現在 にあるデリゲートから取得していNSTemporaryDirectory()
ます。
私はAVAssetWriterInput
それをループするために使用しています。しかし、それは次のように求めますCMSampleBufferRef
:
CMSampleBufferRef
NSTemporaryDirectory() のビデオからこれを取得するにはどうすればよいですか?
に変換するためのコードを見UIImage
たCMSampleBufferRef
ことがありますが、ビデオ ファイルのコードを見つけることができます。
どんな提案も役に立ちます。:)
ios - AudioBufferList を CMBlockBufferRef に変換中にエラーが発生しました
AVAssetReader を使用してビデオ ファイルを読み込んで、オーディオを CoreAudio に渡して処理 (エフェクトなどを追加) してから、AVAssetWriter を使用してディスクに保存しようとしています。出力ノードの AudioComponentDescription に componentSubType を RemoteIO として設定すると、スピーカーから正しく再生されることを指摘したいと思います。これにより、AUGraph が適切にセットアップされていることを確信できます。動作が聞こえるからです。ただし、subType を GenericOutput に設定しているので、自分でレンダリングを行い、調整されたオーディオを取り戻すことができます。
オーディオを読み込んでいて、CMSampleBufferRef を copyBuffer に渡します。これにより、オーディオが循環バッファに入れられ、後で読み込まれます。
次に、processOutput を呼び出します。これにより、outputUnit で手動の reder が実行されます。AudioUnitRender が呼び出されると、以下の playbackCallback が呼び出されます。これは、最初のノードで入力コールバックとして接続されているものです。PlaybackCallback は循環バッファからデータを取得し、渡された audioBufferList にフィードします。前に述べたように、出力が RemoteIO として設定されている場合、オーディオはスピーカーで正しく再生されます。AudioUnitRender が終了すると、noErr が返され、bufferList オブジェクトには有効なデータが含まれます。 CMSampleBufferSetDataBufferFromAudioBufferList を呼び出すと、 kCMSampleBufferError_RequiredParameterMissing (-12731) が取得されます。
渡す CMSampleBufferRef は有効に見えます (以下は、デバッガーからのオブジェクトのダンプです)。
バッファリストは次のようになります
誰かが助けてくれることを願って、ここで本当に途方に暮れています。ありがとう、
問題がある場合は、これをios 8.3シミュレーターでデバッグしています。オーディオは、iPhone 6で撮影してラップトップに保存したmp4からのものです。
次の問題を読みましたが、まだ役に立たず、機能していません。
AudioBufferList を CMSampleBuffer に変換するには?
AudioBufferList を CMSampleBuffer に変換すると予期しない結果が生じる
CMSampleBufferSetDataBufferFromAudioBufferList がエラー 12731 を返す
アップデート
さらに調べてみると、AudioUnitRender が実行される直前の AudioBufferList が次のようになっていることに気付きました。
mDataByteSize は numberFrames*sizeof(SInt32) で、512 * 4 です。playbackCallback で渡された AudioBufferList を見ると、リストは次のようになります。
その他のバッファがどこに行くのか、または他の1024バイトサイズが本当にわからない...
もし私がレッドナーに電話をかけ終わったら、もし私がこのようなことをしたら
newbuff を CMSampleBufferSetDataBufferFromAudioBufferList に渡すと、エラーはなくなります。
BufferList のサイズを 1 mNumberBuffers に設定するか、その mDataByteSize を numberFrames*sizeof(SInt16) に設定しようとすると、AudioUnitRender を呼び出すときに -50 が返されます。
更新 2
スピーカーでサウンドを再生するときに出力を検査できるように、レンダリング コールバックを接続しました。スピーカーに送られる出力にも 2 つのバッファーを持つ AudioBufferList があり、入力コールバック中の mDataByteSize は 1024 で、レンダー コールバックでは 2048 であることに気付きました。これは、AudioUnitRender を手動で呼び出したときに見たものと同じです。レンダリングされた AudioBufferList のデータを調べると、2 つのバッファーのバイトが同じであることがわかります。つまり、2 番目のバッファーは無視できます。しかし、データが取り込まれているため、レンダリング後のサイズが 1024 ではなく 2048 であるという事実を処理する方法がわかりません。なぜそれが起こっているのかについてのアイデアはありますか? オーディオグラフを通過した後、それはより生の形であり、それがサイズが2倍になっている理由ですか?
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 がフレームを表示するフレームレートを制御する方法を知っている人はいますか?