Mediacodec 在线编码视频
Mediacodec to encode video online
我能够实现基于 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。
我的问题是比特率吗?我应该设置哪些值才能接收我显示的每一帧由编码器记录?
谢谢。
我看到 MediaMuxer 在将数据写入磁盘时暂停 1 秒以上,但通常不会以较低的比特率——Grafika 使用的 1Mbps 比特率应该没问题——而且它们通常相隔几秒.所以我不确定这是否是您面临的问题。
这里有一篇关于 MediaMuxer 问题的精彩博客 post:http://blog.horizon.camera/post/134263616000/optimizing-mediamuxers-writing-speed。简而言之,MediaMuxer 写入停止,因此没有帧从 MediaCodec 编码器中拉出。最终 MediaCodec 用完了缓冲区,无法再接受任何输入,因此相机开始丢弃帧。
用 systrace tags will help narrow things down. The idea is to bracket all the "interesting" calls in your encoding setup with android.os.Trace beginSection()
/ endSection()
calls, and collect systrace output with the --app
tag (example here 封装 MediaMuxer 调用。查看 systrace 输出将向您显示每个函数需要多长时间,向您显示每个函数在哪些线程上运行,并帮助您识别调用被阻塞和其他线程饥饿的区域。
完全有可能发生其他事情,但这是一个很好的起点。
我能够实现基于 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。
我的问题是比特率吗?我应该设置哪些值才能接收我显示的每一帧由编码器记录? 谢谢。
我看到 MediaMuxer 在将数据写入磁盘时暂停 1 秒以上,但通常不会以较低的比特率——Grafika 使用的 1Mbps 比特率应该没问题——而且它们通常相隔几秒.所以我不确定这是否是您面临的问题。
这里有一篇关于 MediaMuxer 问题的精彩博客 post:http://blog.horizon.camera/post/134263616000/optimizing-mediamuxers-writing-speed。简而言之,MediaMuxer 写入停止,因此没有帧从 MediaCodec 编码器中拉出。最终 MediaCodec 用完了缓冲区,无法再接受任何输入,因此相机开始丢弃帧。
用 systrace tags will help narrow things down. The idea is to bracket all the "interesting" calls in your encoding setup with android.os.Trace beginSection()
/ endSection()
calls, and collect systrace output with the --app
tag (example here 封装 MediaMuxer 调用。查看 systrace 输出将向您显示每个函数需要多长时间,向您显示每个函数在哪些线程上运行,并帮助您识别调用被阻塞和其他线程饥饿的区域。
完全有可能发生其他事情,但这是一个很好的起点。