5

MediaCodecビデオのエンコードに使用しています。フレームは、カメラ プレビュー コールバックを介してMediaCodecインスタンスに送信されます (サーフェスは使用されません)。多重化にJCodecライブラリを使用しており、生成されたビデオをストリーミングできます (ビデオ プレーヤーは正しい時間を表示し、シーク バーでビデオの位置を変更できます)。

MediaMuxer今日、代わりに使用しようとしJCodecましたが、ビデオはまだ問題なく見えますが、持続時間が完全に正しくなく (1 分ではなく数時間)、シーク バーがまったく機能しません。

mediaMuxer = new MediaMuxer("/path/to/video.mp4", MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);

を受け取ると、次のコードが遅延して呼び出されますMediaCodec.INFO_OUTPUT_FORMAT_CHANGED

videoTrackIndex = mediaMuxer.addTrack(encoder.getMediaFormat());
mediaMuxer.start();

次のコードでフレームをエンコードしています。

mediaMuxer.writeSampleData(videoTrackIndex, byteBuffer, bufferInfo);

byteBufferいくつかのポジショニングの後bufferInfoに直接来ています:MediaCodec

byteBuffer.position(bufferInfo.offset);
byteBuffer.limit(bufferInfo.offset + bufferInfo.size);

プレゼンテーション時間は正しく設定されています:

mMediaCodec.queueInputBuffer(inputBufferIndex, 0, getWidth() * getHeight() * 1.5, System.nanoTime() / 1000, 0);

そして、記録の最後に私は次のことを行います:

mediaMuxer.stop();
mediaMuxer.release();

ログ:

I/MPEG4Writer﹕ setStartTimestampUs: 0
I/MPEG4Writer﹕ Earliest track starting time: 0
D/MPEG4Writer﹕ Stopping Video track
I/MPEG4Writer﹕ Received total/0-length (770/0) buffers and encoded 770 frames. - video
D/MPEG4Writer﹕ Stopping Video track source
D/MPEG4Writer﹕ Video track stopped
D/MPEG4Writer﹕ Stopping writer thread
D/MPEG4Writer﹕ 0 chunks are written in the last batch
D/MPEG4Writer﹕ Writer thread stopped
I/MPEG4Writer﹕ The mp4 file will not be streamable.
D/MPEG4Writer﹕ Stopping Video track

私はThe mp4 file will not be streamable.問題についての信号を推測します。

アップデート:

より詳細なログを記録する別のデバイス (LG G2) でアプリをテストしました。同じファイルが膨大な期間で生成されます。ログはこちら、動画ファイルはこちら

4

1 に答える 1

6

@fadden のおかげで問題を解決できました。実際には、最初のフレームを presentationTimeUs = 0 で送信していました。これは、MediaCodec.BUFFER_FLAG_CODEC_CONFIGフラグ付きのフレームを適切に処理していなかったために発生しました。私は実際にそれらをマルチプレクサに供給していましたが、次のコードでそれらをスキップする必要がありました (のように):

if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
  mBufferInfo.size = 0;
}
于 2014-06-09T07:00:32.097 に答える