0

Grafika の CameraCaptureActivity でビデオ ベースを記録するコードを実装できました。これで、1 から 10 まで数えながら自分自身を記録できますが、記録されたビデオを見に行くと、1、3、8、9 と言っています。サーフェスは次のように構成されました。

private static int VIDEO_WIDTH = 720;  // dimensions for 720p video
private static int VIDEO_HEIGHT = 1280;
private static int DESIRED_PREVIEW_FPS = 30; 

そしてエンコーダー

format.SetInteger(MediaFormat.KeyColorFormat, (int)MediaCodecCapabilities.Formatsurface);
format.SetInteger(MediaFormat.KeyBitRate, 100000);
format.SetInteger(MediaFormat.KeyFrameRate, 30);
format.SetInteger(MediaFormat.KeyIFrameInterval, 5);

幅: 310、高さ: 310。

私の問題はビットレートですか?エンコーダーによって記録されるように表示するすべてのフレームを受信するには、どの値を設定する必要がありますか? ありがとう。

4

1 に答える 1

2

ディスクにデータを書き込むときに MediaMuxer が 1 秒以上一時停止するのを見たことがありますが、一般的にビット レートが低い場合はそうではありません。それがあなたが直面している問題であるかどうかはわかりません。

ここに MediaMuxer の問題に関する素晴らしいブログ記事があります: http://blog.horizo ​​n.camera/post/134263616000/optimizing-mediamuxers-writing-speed。つまり、MediaMuxer の書き込みが停止するため、MediaCodec エンコーダーからフレームが取り出されません。最終的に、MediaCodec はバッファーを使い果たし、それ以上入力を受け取ることができないため、カメラはフレームの破棄を開始します。

MediaMuxer 呼び出しをsystraceタグでラップすると、対象を絞り込むのに役立ちます。アイデアは、エンコーディング設定のすべての「興味深い」呼び出しをandroid.os.Trace beginSection() /呼び出しで囲み、タグendSection()で systrace 出力を収集することです (例はこちら)。systrace の出力を見ると、各関数の所要時間、各関数が実行されているスレッドが表示され、呼び出しがブロックされて他のスレッドが不足している領域を特定するのに役立ちます。--app

他に何かが起こっている可能性は十分にありますが、ここから始めるのが良いでしょう。

于 2016-01-19T00:51:15.747 に答える