• Android学习笔记 48. Android 多媒体技术——MediaRecorder录制视频


    Android学习笔记

    Android 多媒体技术

    48. Android 多媒体技术——MediaRecorder录制视频

    48.1 MediaRecorder录制视频

    使用MediaRecorder能够编写从设备麦克风与相机捕获音视频、保存音频并使用MediaRecorder进行播放的应用。

    添加权限

    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    
    • 1
    • 2

    在这里插入图片描述

    Android6.0以上还需要进行动态申请。

    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO},100);
    
    • 1
    • 2

    在这里插入图片描述

    布局

    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        android:orientation="vertical"
        >
        
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button"
            android:text="录制视频"
            android:onClick="record"
            />
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button2"
            android:text="播放视频"
            android:onClick="playvideo"
            />
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button3"
            android:text="播放音效"
            android:onClick="playAudio"
            />
        
    
    LinearLayout>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    在这里插入图片描述

    新建跳转Activity

    MediaRecordActivity.java

    package com.dingjiaxiong.mymediarecorder;
    
    import androidx.annotation.Nullable;
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.hardware.Camera;
    import android.media.MediaRecorder;
    import android.os.Bundle;
    import android.text.TextUtils;
    import android.view.Surface;
    import android.view.TextureView;
    import android.view.View;
    import android.widget.Button;
    
    import java.io.File;
    import java.io.IOException;
    
    public class MediaRecordActivity extends AppCompatActivity implements View.OnClickListener {
        private TextureView textureView;
        private Button btn_opt;
        private MediaRecorder mediaRecorder;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_media_record);
            textureView = findViewById(R.id.textureView);
            btn_opt = findViewById(R.id.btn_opt);
    
            btn_opt.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            CharSequence text = btn_opt.getText();
            if (TextUtils.equals(text, "开始")) {
                btn_opt.setText("结束");
                mediaRecorder = new MediaRecorder();
                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //设置音频源 麦克风
                mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);//设备视频源 摄像头
                mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//指定视频文件格式
                mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
                mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
                //设置视频输出文件
                mediaRecorder.setOutputFile(new File(getExternalFilesDir(""), "a.mp4").getAbsolutePath());
                mediaRecorder.setVideoSize(640, 480);
                mediaRecorder.setPreviewDisplay(new Surface(textureView.getSurfaceTexture()));
                try {
                    mediaRecorder.prepare();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                mediaRecorder.start();
            } else {
                btn_opt.setText("开始");
                mediaRecorder.stop();
                mediaRecorder.release();
            }
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    布局文件

    activity_media_record.xml

    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MediaRecordActivity"
        android:orientation="vertical">
    
        <TextureView
            android:id="@+id/textureView"
            android:layout_width="match_parent"
            android:layout_height="500dp"/>
    
        <Button
            android:id="@+id/btn_opt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="开始"
    
            />
    
    
    LinearLayout>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    运行工程

    在这里插入图片描述

    同时视频也保存了

    在这里插入图片描述

    不过预览画面有些问题

    在这里插入图片描述

    画面颠了一下。

    修正。

    在这里插入图片描述

    再次运行

    在这里插入图片描述

    预览还是不对

    看下录制的文件

    在这里插入图片描述

    文件是正的

    解决预览的颠倒问题

    借助camera

    在这里插入图片描述

    再次运行

    在这里插入图片描述

    画面正过来了。

    视频也是正的。

    开始 结束,再开始,程序会挂掉。

    因为camera没释放。

    在这里插入图片描述

    再次运行,无误。

  • 相关阅读:
    Java中的流Stream和读取器Reader及其之间的关系
    机器学习算法(五):基于企鹅数据集的决策树分类预测
    第五章:Python中的集合(上)
    会议OA项目----我的审批
    每日分享html之2个悬停、2个加载、1个button
    【学习笔记】Java 一对一培训(3.1)Spring Boot介绍和基础
    总结vue框架中的钩子函数
    C#Word上传和转成Pdf实现
    React源码分析3-render阶段(穿插scheduler和reconciler)
    JavaWeb笔记
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/126314445