当前位置: 代码迷 >> Android >> Android录制视频分段保留的探究
  详细解决方案

Android录制视频分段保留的探究

热度:112   发布时间:2016-04-28 01:59:35.0
Android录制视频分段保存的探究

录制视频需要分段保存,可以从系统源码考虑,看了以下一些代码:

  • framework/av/media/libstagefright/MPEG4Writer.cpp
  • package/apps/Camera/src/com/android/camera/actor/VideoActor.java

主要从MPEG4Writer.cpp中的kMax32BitFileSize 和入手,如下,修改单个文件最大容量为56M(0x3800000),发现利用系统Camera录像时,到达阀值后会提示“已达到大小上限”,并自动停止,保存已经录制的视频。

static const int64_t kMax32BitFileSize = 0x3800000;//0x00ffffffffLL; // 2^32-1 : max FAT32static const int64_t kMax32BitDuration = 0x007fffffffLL;

然后追踪到VideoActor的处理。有一个思路,就是停止的时候,进行文件保存后立即重新启动录像。

    public void stopVideoRecordingAsync() { // TChip ZJ        // for snapshot        stopObjectTracking();        mStopVideoRecording = true;        Log.d(TAG, "stopVideoRecordingAsync() mMediaRecorderRecording=" + mMediaRecorderRecording                 + ", mRecorderBusy=" + mRecorderBusy                 + ", isVideoProcessing()" + isVideoProcessing()                + ", mStopVideoRecording =" + mStopVideoRecording);        mVideoContext.getZoomManager().changeZoomForQuality();        mVideoContext.setSwipingEnabled(true);        mHandler.removeMessages(UPDATE_RECORD_TIME);        mVideoContext.getShutterManager().setVideoShutterMask(false);        if (isVideoProcessing()) {            return;        }        if (mRecorderBusy) { // return for recorder is busy.            return;        }        mRecorderBusy = true;        mRecordingView.hide();        if (mMediaRecorderRecording) {            mVideoContext.getShutterManager().setVideoShutterEnabled(false);            if (mStoppingAction != STOP_RETURN_UNVALID && mCallFromOnPause != true) {               // mVideoContext.showProgress(mVideoContext.getResources().getString(R.string.saving)); // TChip ZJ : 去掉保存UI            }            mVideoSavingTask = new SavingTask();            mVideoSavingTask.start();        } else {            mRecorderBusy = false;            releaseRecorder();            if (mStoppingAction == STOP_RETURN_UNVALID) {                doReturnToCaller(false);            }        }    }

先吃饭了,明天再看实现的可行性以及效果(是否漏秒)。
继续追踪
看了下保存的逻辑,涉及以下两处源码:

packages/apps/Camera/src/com/android/camera/manager/MMProfileManager.javamediatek/frameworks/base/mmprofile/java/com/mediatek/mmprofile/MMProfileManager.java

然后从MMProfileManager定位到MMProfile:

mediatek/frameworks/base/mmprofile/java/com/mediatek/mmprofile/MMProfile.java

这个类比较简单,加载了JNI库,再追下去就到c了。

public class MMProfile {    static    {        System.loadLibrary("mmprofile_jni");    }    public static final int MMP_RootEvent = 1;    // MMP_LogType    public static final int MMProfileFlagStart = 1;    public static final int MMProfileFlagEnd = 2;    public static final int MMProfileFlagPulse = 4;    public static final int MMProfileFlagEventSeparator = 8;    public static final int MMProfileFlagSystrace = 0x80000000;    public native static int MMProfileRegisterEvent(int parent, String name);    public native static int MMProfileFindEvent(int parent, String name);    public native static void MMProfileEnableEvent(int event, int enable);    public native static void MMProfileEnableEventRecursive(int event, int enable);    public native static int MMProfileQueryEnable(int event);    public native static void MMProfileLog(int event, int type);    public native static void MMProfileLogEx(int event, int type, int data1, int data2);    public native static int MMProfileLogMetaString(int event, int type, String str);    public native static int MMProfileLogMetaStringEx(int event, int type, int data1, int data2, String str);}
  相关解决方案