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) でアプリをテストしました。同じファイルが膨大な期間で生成されます。ログはこちら、動画ファイルはこちら。