8

ビデオサンプルバッファを取得するために以下を使用しています:

- (void) writeSampleBufferStream:(CMSampleBufferRef)sampleBuffer ofType:(NSString *)mediaType

私の質問は、上記のsampleBufferから h.264 でエンコードされた NSData を取得するにはどうすればよいかということです。提案してください。

4

3 に答える 3

7

2017 年の更新:

VideoToolboxAPIを使用して、ビデオとオーディオのストリーミングを今すぐ実行できます。こちらのドキュメントをお読みください: VTCompressionSession

元の回答(2013年から):

短い: できません。受け取ったサンプル バッファーは圧縮されていません。

ハードウェア アクセラレーションによる h264 圧縮を取得する方法:

どちらもファイルへの書き込みが見られるように、フレームまたは GOP が完全に書き込まれた後にエンコーダーがヘッダー情報を更新するため、パイプへの書き込みは機能しません。したがって、エンコーダーがヘッダー情報をランダムに書き換えるため、エンコーダーがファイルに書き込みを行っている間はファイルに触れないでください。このヘッダー情報がないと、ビデオ ファイルは再生できません (サイズ フィールドが更新されるため、書き込まれた最初のヘッダーはファイルが 0 バイトであることを示します)。現在、メモリ領域への直接書き込みはサポートされていません。ただし、エンコードされたビデオ ファイルを開き、ストリームを demux して h264 データを取得できます (もちろん、エンコーダーがファイルを閉じた後)。

于 2013-06-10T13:42:25.733 に答える
6

AVFoundation から取得できるのは、BGRA または YUV カラー形式の未加工のビデオ画像のみです。ただし、これらのフレームを AVAssetWriter 経由で mp4 に書き込むと、H264 エンコーディングを使用してエンコードされます。

それを行う方法に関するコードの良い例はRosyWriter です

各 AVAssetWriter 書き込みの後、1 つの完全な H264 NAL が mp4 に書き込まれたことがわかることに注意してください。AVAssetWriter による各書き込みの後に完全な H264 NAL を読み取るコードを作成すると、H264 でエンコードされたフレームにアクセスできるようになります。まともな速度で正しく理解するには少し時間がかかるかもしれませんが、実行可能です (私は成功しました)。

ところで、これらのエンコードされたビデオ フレームを正常にデコードするには、mp4 ファイルの別の場所にある H264 SPS および PPS 情報が必要です。私の場合、実際にいくつかのテスト mp4 ファイルを作成し、それらを手動で抽出しました。これらは変更されないため、H264 エンコードの仕様を変更しない限り、コードで使用できます。

コードで使用した SPS/PPS の一部を確認するには、iPhone の H 264 ストリームの SPS 値への投稿を確認してください。

最後の注意として、私の場合、h264 でエンコードされたフレームを別のエンドポイントにストリーミングして、デコード/表示する必要がありました。そのため、私のコードはこれを高速に実行する必要がありました。私の場合は、比較的高速でした。しかし、ファイルの読み取り/書き込みなしですべてがメモリ内で行われたため、エンコード/デコードがはるかに高速だったという理由だけで、最終的にはエンコード/デコード用に VP8 に切り替えました。

うまくいけば、この情報がお役に立てば幸いです。

于 2013-06-12T16:04:58.743 に答える