最近在使用MediaRecorder实现录屏功能,因为平台是外接USB麦克风或者带麦克风摄像头之类的,巨坑,好多坑。本来是一个小应用,结果问题一个接一个
跟踪MediaRecorder流程的原因是,录屏录制一个多小时后,停不下来了,卡住了ANR了!
根据log分析,可以定位到异常位置
异常的地方是在framework/av/media/libstagefright/MediaCodecSource.cpp
在停止audio部分时耗时异常,AudioSource无法正常停止引起
Line 1206750: 03-16 20:35:04.085 I/MediaCodecSource( 1990): encoder (audio) stopping
......
Line 1220270: 03-16 20:41:12.485 I/MediaCodecSource( 1990): encoder (audio) stopped
历时6分钟
框架流程大致如下:
stop过程:
首先MediaRecorder.java调用stop,会调用jni-> android_media_MediaRecorder_stop(JNIEnv *env, jobject thiz),
接着MediaRecorder.cpp(MediaRecorder是由MediaplayerService创建的,MediaplayerService创建MediaRecorderClient,MediaRecorderClient实际是创建StagefightRecorder),
最终会调StagefightRecorder.cpp的stop,
然后是MPEG4Writer.cpp的stop,
MPEG4Writer再分别去video encoder source和 audio encoder source,对应的是MediaCodecSource.cpp,
MediaCodecSource最终调用mPuller->stop():这里会去释放MediaBuffer,初步分析是MediaBuffer还有数据未处理完或者有异常释放不了,导致程序卡住