`

安卓实现视频录制

阅读更多

安卓实现视频录制,我发现有两种方法,一种是调用自带的视频功能,一种是使用MediaRecorder。

以下内容也是通过自己测试整理而来。转载请注明出处:http://www.pm-road.com/index.php/2014/12/05/267/

这两种方法我全部测试了,每种方法都有自己的优缺点。接下来,把两种方法的代码写出来。

先说第一种方法,也是最简单的方法,那就是直接调用系统的视频功能。

代码很简单:

//这是跳转至录制视频界面的按钮监听

    class VideoListener implements OnClickListener {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

//在这里的QUALITY参数,值为两个,一个是0,一个是1,代表录制视频的清晰程度,0最不清楚,1最清楚

//没有0-1的中间值,另外,使用1也是比较占内存的,测试了一下,录制1分钟,大概内存是43M多

//使用0,录制1分钟大概内存是几兆
            intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
            // 限制时长 ,参数61代表61秒,可以根据需求自己调,最高应该是2个小时。

//当在这里设置时长之后,录制到达时间,系统会自动保存视频,停止录制
            intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 61);
            // 限制大小 限制视频的大小,这里是100兆。当大小到达的时候,系统会自动停止录制
            intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, 1024 * 1024 * 100);

//在这里有录制完成之后的操作,系统会默认把视频放到照片的文件夹中
            startActivityForResult(intent, 11);
     
        }

 

 

 

接下来是第二方法 ,也是比第一次麻烦的方法 ,使用MediaRecorder:

//跳转至录制视频页面的按钮事件

class VideoListener implements OnClickListener {

        @Override
        public void onClick(View v) {
        
            Intent intent = new Intent(context,MovieRecorder.class);
            startActivity(intent);
          
        }

    }

 

 

MovieRecorder.class 中的代码:

package com.titan.ti_yuqiao.video;

import java.io.File;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.graphics.PixelFormat;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.Toast;

import com.titan.ti_yuqiao.R;

public class MovieRecorder extends Activity implements OnClickListener {
    // 程序中的两个按钮,录制和停止
    ImageButton record, stop;
    // 系统的视频文件
    File videoFile;
    MediaRecorder mRecorder;
    // 显示视频预览的SurfaceView
    SurfaceView sView;
    // 记录是否正在进行录制
    private boolean isRecording = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 去掉标题栏 ,必须放在setContentView之前
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.video);
        // 设置横屏显示
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        // 设置全屏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        // 选择支持半透明模式,在有surfaceview的activity中使用。
        getWindow().setFormat(PixelFormat.TRANSLUCENT);
        // 获取程序界面中的两个按钮
        record = (ImageButton) findViewById(R.id.record);
        stop = (ImageButton) findViewById(R.id.stop);
        // 让stop按钮不可用。
        stop.setEnabled(false);
        // 为两个按钮的单击事件绑定监听器
        record.setOnClickListener(this);
        stop.setOnClickListener(this);
        // 获取程序界面中的SurfaceView
        sView = (SurfaceView) this.findViewById(R.id.sView);
        // 设置分辨率
        sView.getHolder().setFixedSize(1280, 720);
        // 设置该组件让屏幕不会自动关闭
        sView.getHolder().setKeepScreenOn(true);
    }

    @Override
    public void onClick(View source) {
        switch (source.getId()) {
        // 单击录制按钮
        case R.id.record:
            if (!Environment.getExternalStorageState().equals(
                    android.os.Environment.MEDIA_MOUNTED)) {
                Toast.makeText(MovieRecorder.this, "SD卡不存在,请插入SD卡!",
                        Toast.LENGTH_SHORT).show();
                return;
            }
            try {
                // 创建保存录制视频的视频文件,视频结果会保存在sd卡的根目录20141205123345.3gp
                videoFile = new File(Environment.getExternalStorageDirectory()
                        .getCanonicalFile() + "/20141205123345.3gp");
                // 创建MediaPlayer对象
                mRecorder = new MediaRecorder();
                mRecorder.reset();
                // 设置从麦克风采集声音(或来自录像机的声音AudioSource.CAMCORDER)
                mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                // 设置从摄像头采集图像
                mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
                // 设置视频文件的输出格式
                // 必须在设置声音编码格式、图像编码格式之前设置
                mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                // 设置声音编码的格式
                mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                // 设置图像编码的格式
                mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

//我一开始将这里的分辨率调成了640,480调完之后,发现录出的视频会花屏,改成1280,720则没事
                mRecorder.setVideoSize(1280, 720);
                // 每秒 4帧
                mRecorder.setVideoFrameRate(20);
                //数值越大,越清晰,占用内存越大,一开始我使用的是5*1024*1024,画面的质量和第一种方法质量为0的时候差不多,

//后来改成7*1024*1024,清晰度立马提升,后来写成了8*1024*1024
                mRecorder.setVideoEncodingBitRate(8*1024*1024);
                mRecorder.setOutputFile(videoFile.getAbsolutePath());
                // 指定使用SurfaceView来预览视频
                mRecorder.setPreviewDisplay(sView.getHolder().getSurface()); // ①
                mRecorder.prepare();
                // 开始录制
                mRecorder.start();
              
                // 让record按钮不可用。
                record.setEnabled(false);
                // 让stop按钮可用。
                stop.setEnabled(true);
                isRecording = true;
            } catch (Exception e) {
                e.printStackTrace();
            }
            break;
        // 单击停止按钮
        case R.id.stop:
            // 如果正在进行录制
            if (isRecording) {
                // 停止录制
                mRecorder.stop();
                // 释放资源
                mRecorder.release();
                mRecorder = null;
                // 让record按钮可用。
                record.setEnabled(true);
                // 让stop按钮不可用。
                stop.setEnabled(false);
            }
            break;
        }
    }
}

 

 

以下是该MovieRecorder.class对应的xml配置

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 显示视频预览的SurfaceView -->
<SurfaceView
android:id="@+id/sView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true">
<ImageButton
android:id="@+id/record"
android:layout_width="66dp"
android:layout_height="66dp"
android:scaleType="fitCenter"
android:src="@drawable/red_no_problem" />
<ImageButton
android:id="@+id/stop"
android:layout_width="66dp"
android:layout_height="66dp"
android:scaleType="fitCenter"
android:src="@drawable/red_success" />
</LinearLayout>
</RelativeLayout>

 

对该程序添加权限:

 

  • <!-- 授予该程序录制声音的权限 -->
  •     <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  •     <!-- 授予该程序使用摄像头的权限 -->
  •     <uses-permission android:name="android.permission.CAMERA"/>
  •     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
  •     <!-- 授予使用外部存储器的权限 -->
  •     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

通过对这两种方法的测试,也发现两种方法的优缺点,以下为对比:

一:使用第一种方法,方便快捷,不需要太多的代码量;

使用第二种方法,代码量稍大;

二:第一种方法视频清晰度只有两种,一个是最不清楚,一个是最清楚;

第二种方法视频清晰度可根据数值自动往上调 ;

三:第一种方法,清晰度为1的时候,会占用大内存;

第二种方法 :清晰度越高的时候,内存也会增大;

经测试:第一种方法清晰度为1,录制一分钟,大小在43M左右;第二种方法当为8*1024*1024时,录制一分钟,大小在57M;

四:第一种方法在录制过程中,操作方便,有自己的暂停、录制、播放按钮 ;

第二种只能自己去写暂停、录制或播放按钮;

综上,如果内存足够大的时候,个人推荐使用第一种方法,方便快捷。

以上内容也是通过自己测试整理而来。转载请注明出处:http://www.pm-road.com/index.php/2014/12/05/267/

 

0
0
分享到:
评论

相关推荐

    Android实现视频录制加拍照

    在Android平台上,开发一款应用程序,实现视频录制和拍照功能是非常常见的需求。这些功能可以用于创建社交媒体应用、教育软件,甚至是个人日记应用等。本篇文章将详细介绍如何通过Intent接口来实现这一目标,使得...

    android 视频录制 并保存到本地

    本文将详细讲解如何实现Android视频录制,并将录制的视频保存到设备的本地存储,尤其是SD卡上。 首先,Android系统提供了一个名为`MediaRecorder`的类,它是用于处理多媒体数据录制的核心组件。使用`MediaRecorder`...

    android短视频录制编辑

    在Android平台上,开发短视频录制和编辑功能是一项技术性较强的任务,涉及到多媒体处理、图像处理以及用户界面设计等多个方面。在本项目中,开发者利用了开源库RxFFmpeg来实现这一功能,这是一个基于FFmpeg库的...

    Android 音视频录制

    本篇文章将深入探讨Android音视频录制的核心知识点,并基于提供的"RecordDemo"压缩包文件,来解析如何实现这一功能。 一、Android音视频录制基础 1. MediaRecorder:Android系统提供了MediaRecorder类,用于录制...

    安卓,录制短视频

    通常,对于短视频录制,我们使用MediaRecorder.AudioSource.MIC和MediaRecorder.VideoSource.CAMERA。 2. **设置输出格式**:通过调用setOutputFormat方法设置视频的容器格式,如MPEG_4或3GP。 3. **设定输出文件*...

    Android代码-安卓视频录制Demo

    这个"Android代码-安卓视频录制Demo",名为"VideoRecorder-master",提供了一个基础的视频录制功能的示例,旨在帮助开发者理解和实现Android设备上的视频捕获。下面我们将深入探讨相关的Android编程知识点。 首先,...

    android小视频录制,可直接用于项目

    在不同的Android版本上,API的行为可能会有所不同,因此实现一个跨版本兼容的视频录制功能需要考虑以下几点: 1. 使用`Build.VERSION.SDK_INT`检查系统版本,针对不同版本调用相应的API。 2. 检查设备是否支持特定的...

    安卓短视频录制

    在Android平台上实现类似微信的短视频录制功能,需要掌握以下几个核心知识点: 1. **多媒体框架**: 安卓系统提供了丰富的多媒体框架,包括`MediaRecorder`用于录制视频,`MediaPlayer`用于播放媒体文件。`...

    java实现视频的录制和拍照功能Demo

    Java 实现视频录制和拍照功能是一项常见的需求,尤其是在开发多媒体应用程序或者移动应用时。Java Media Framework (JMF) 是一个用于处理音频、视频和多播数据的平台,它为Java开发者提供了一套全面的框架来播放、...

    Android小视频录制技术实现

    在Android平台上实现小视频录制功能是一项常见的需求,尤其在社交应用中,如微信。这个功能的实现涉及到多媒体处理、硬件加速、以及第三方SDK的集成等多个技术环节。在本项目"ShVideoDemo-master"中,我们将重点探讨...

    android视频录制和播放

    在Android平台上,视频录制与播放是一项常见的功能,广泛应用于各种应用程序,如社交应用、教育软件、游戏等。当用户在Android设备上录制视频时,有时可能会遇到视频倒置的问题,这通常是由于摄像头配置不当或者处理...

    Android 短视频录制demo

    这个"Android短视频录制demo"项目提供了一个基础的实现方案,可以帮助开发者快速理解并构建自己的短视频录制功能。下面将详细介绍这个Demo涉及的关键知识点。 首先,Android短视频录制涉及到的主要技术包括音视频...

    仿微信视频录制

    在Android平台上,仿微信视频录制是一项常见的需求,它涉及到多媒体处理、用户界面设计以及系统级权限的管理等多个方面的技术。微信视频录制功能的核心在于提供流畅、高质量的录制体验,同时保持用户界面简洁易用。...

    android视频录制预览网络播放

    通过设置输出格式(如 MP4)、编码器(如 H.264)、音频和视频源,我们可以配置 MediaRecorder 实现视频录制。例如: ```java mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mediaRecorder....

    Android Camera2 Demo - 实现相机预览、拍照、录制视频功能

    其中包括一个自己写的Camera2的Demo,支持预览、拍照和视频录制,以及若干个网上找的,具有参考价值的Camera2 Demo。 具体看我的博客 : https://blog.csdn.net/EthanCo/article/details/131371887 ...

    自定义视频录制

    本资源提供的就是一个基于Android的视频录制示例项目,通过整合Camera、SurfaceView和MediaRecorder这三个关键组件,来实现自定义的视频录制功能。下面将详细讲解这些组件以及如何将它们结合使用。 1. **Camera**:...

    android 摄像头、视频录制demo (竖屏)

    在Android平台上,开发摄像头应用和实现视频录制是常见的任务,特别是在设计移动应用时。本示例专注于"竖屏"模式,确保用户在预览、拍照和录制视频时获得正确的横竖屏体验。以下是对这个“android 摄像头、视频录制...

    Android 音视频录制程序

    在Android平台上开发音视频录制程序是一项常见的任务,它涉及到多媒体处理、硬件访问和编码解码等技术。在本项目中,我们关注的是使用H.263视频编码和AMR_NB音频编码进行录制。以下是对这些关键技术点的详细说明: ...

    android视频录制

    总结来说,"android视频录制"项目展示了如何在Android平台上实现一个高效、用户友好的短视频录制功能。通过深入研究"VideoRecorder-master"的源代码,开发者可以学习到如何使用MediaRecorder、Camera2 API、处理权限...

    android的仿微信视频录制播放

    综上所述,实现“android的仿微信视频录制播放”涉及到的关键技术包括`MediaRecorder`和`MediaPlayer`的使用、文件系统的操作、SurfaceView的显示、用户交互设计、权限管理以及性能优化。通过熟练掌握这些知识点,...

Global site tag (gtag.js) - Google Analytics