首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用MediaMuxer创建不可流视频文件

用MediaMuxer创建不可流视频文件
EN

Stack Overflow用户
提问于 2014-05-29 13:06:28
回答 1查看 4K关注 0票数 6

我正在使用MediaCodec编码视频。帧正在通过摄像机预览回调到MediaCodec实例(没有使用Surface )。我正在使用JCodec库的穆兴和我能够流产生的视频(视频播放器显示正确的持续时间,我可以改变视频位置寻求条)。

今天,我尝试使用MediaMuxer而不是JCodec,我的视频看起来还不错,但是持续时间是绝对不正确的(几个小时而不是一分钟),搜索栏根本不起作用。

代码语言:javascript
复制
mediaMuxer = new MediaMuxer("/path/to/video.mp4", MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);

当我收到MediaCodec.INFO_OUTPUT_FORMAT_CHANGED时,将延迟调用以下代码

代码语言:javascript
复制
videoTrackIndex = mediaMuxer.addTrack(encoder.getMediaFormat());
mediaMuxer.start();

我用以下代码对帧进行编码:

代码语言:javascript
复制
mediaMuxer.writeSampleData(videoTrackIndex, byteBuffer, bufferInfo);

byteBufferbufferInfo在做了一些定位工作之后,直接从MediaCodec获得了信息:

代码语言:javascript
复制
byteBuffer.position(bufferInfo.offset);
byteBuffer.limit(bufferInfo.offset + bufferInfo.size);

正确设置演示时间:

代码语言:javascript
复制
mMediaCodec.queueInputBuffer(inputBufferIndex, 0, getWidth() * getHeight() * 1.5, System.nanoTime() / 1000, 0);

在记录的最后,我这样做:

代码语言:javascript
复制
mediaMuxer.stop();
mediaMuxer.release();

日志:

代码语言:javascript
复制
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)上测试了我的应用程序,它可以进行更详细的日志记录。同样的文件产生的持续时间很长。日志是这里,视频文件是这里

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-09 07:00:32

多亏了@fadden,我才能解决这个问题。我实际上是用presentationTimeUs = 0发送我的第一个帧。发生这种情况是因为我没有正确处理带有MediaCodec.BUFFER_FLAG_CODEC_CONFIG标志的帧。我实际上是将它们提供给muxer,但是我应该用下面的代码跳过它们(按照示例):

代码语言:javascript
复制
if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
  mBufferInfo.size = 0;
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23934087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档