【问题标题】:Background video recording in Android 4.0Android 4.0 中的后台视频录制
【发布时间】:2013-02-09 12:55:17
【问题描述】:

我尝试在 Android 4.0 中组织后台视频录制。但是因为这些问题我做不到:

  1. Dummy Surface 在 MediaRecorder 中不起作用(错误:无效表面)

  2. 如果在 Activity 上使用 Surface 1 x 1 px,Surface 会在 Activity 暂停时销毁(停止录制)

  3. 如果您在 WindowsManager 上使用 Surface 1 x 1 px,Surface 会在应用程序暂停时销毁(停止录制)

  4. SurfaceTexture 在 MediaRecorder.setPreviewDisplay(new Surface(SurfaceTexture)) 中不起作用

  5. 小部件不允许处理 Surface 1 x 1 px

  6. 状态栏不允许处理 Surface 1 x 1 px

请帮我找到正确的方法。

【问题讨论】:

  • 你能给我隐藏摄像头的代码吗

标签: android video background recording


【解决方案1】:

示例和简单代码(在 Jelly Bean、SGS2 上测试):

public class BackgroundVideoRecorder extends Service implements SurfaceHolder.Callback {

    private WindowManager windowManager;
    private SurfaceView surfaceView;
    private Camera camera = null;
    private MediaRecorder mediaRecorder = null;

    @Override
    public void onCreate() {

        // Start foreground service to avoid unexpected kill
        Notification notification = new Notification.Builder(this)
            .setContentTitle("Background Video Recorder")
            .setContentText("")
            .setSmallIcon(R.drawable.ic_launcher)
            .build();
        startForeground(1234, notification);

        // Create new SurfaceView, set its size to 1x1, move it to the top left corner and set this service as a callback
        windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
        surfaceView = new SurfaceView(this);
        LayoutParams layoutParams = new WindowManager.LayoutParams(
            1, 1,
            WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
            PixelFormat.TRANSLUCENT
        );
        layoutParams.gravity = Gravity.LEFT | Gravity.TOP;
        windowManager.addView(surfaceView, layoutParams);
        surfaceView.getHolder().addCallback(this);

    }

    // Method called right after Surface created (initializing and starting MediaRecorder)
    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {

        camera = Camera.open();
        mediaRecorder = new MediaRecorder();
        camera.unlock();

        mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
        mediaRecorder.setCamera(camera);
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

        mediaRecorder.setOutputFile(
                Environment.getExternalStorageDirectory()+"/"+
                DateFormat.format("yyyy-MM-dd_kk-mm-ss", new Date().getTime())+
                ".mp4"
        );

        try { mediaRecorder.prepare(); } catch (Exception e) {}
        mediaRecorder.start();

    }

    // Stop recording and remove SurfaceView
    @Override
    public void onDestroy() {

        mediaRecorder.stop();
        mediaRecorder.reset();
        mediaRecorder.release();

        camera.lock();
        camera.release();

        windowManager.removeView(surfaceView);

    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {}

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {}

    @Override
    public IBinder onBind(Intent intent) { return null; }

}

不要忘记权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

【讨论】:

  • 正要发布这个。诀窍是在 OnSurfaceCreated 上设置 MediaRecorder,之后它就变得非常简单了。
  • 感谢您提供的出色代码,但我有一个小问题。我在 Nexus 5X 上对其进行了测试,发现相机倒置了。我尝试了 camera.setDisplayOrientation(90) 和 camera.getParameters().setRotation(90),但没有改变相机方向。你知道如何改变它吗?
  • 真的很抱歉这么晚才回复。我希望这会有所帮助:plus.google.com/+AndroidDevelopers/posts/jXNFNKWxsc3 - 如果没有,你可以试试这个:mediaRecorder.setOrientationHint(180); - 它不会改变相机的方向,而是告诉视频播放器在播放时改变方向。这就是我所知道的。
  • 此解决方案有效,但开始录制时屏幕冻结。零测试
【解决方案2】:
try { 
        mediaRecorder.prepare(); 
    } catch (Exception e) {}
    mediaRecorder.start();
    Timer t = new Timer();
    t.schedule(new TimerTask() {
        @Override
        public void run() {
            stopSelf();
        }
    }, 5000);
}catch(Exception e){}

只需对上述代码稍作修改...它将 5sec 文件保存到您 sdcard 的根文件夹中...根据您的需要修改计时器。它也适用于 Nexus 4 和 Micromax..

【讨论】:

    【解决方案3】:

    我找到了答案:必须使用WindowManager并从Service中调用它。

    【讨论】:

    • 请张贴代码!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多