《android多媒体api》系列是整合梳理android开发中经常用到的媒体相关api;多媒体开发主要内容有音频、视频录制播放、摄像头操作、录制操作、流媒体、直播、推流、拉流等方面;最近几年移动直播和视频应用发展犹如雨后春笋一般直插云霄,呃。。好吧这段比喻可以不用看了!!,反正行业兴起肯定催生了很多多媒体相关应用开发程序员。那么怎样才能成为多媒体开发程序员,首先必须要熟练使用和了解android自带的多媒体api,并且还要掌握pcm、yuv、rgb、h264、aac、flv、mpegts、mp4、udp、rtp、rtmp等等众多文件格式和流媒体协议等等。所以这里整理android相关多媒体api,提供给想从事流媒体同学作为参照,同样还是要鸣谢网络上那些具有分享精神大神们!!

####基本概念:

  1. 视频播放:demuxer(解复用)->分离出音频流和视频流->decoder(解码)->播放原始数据(例如:pcm yuv)
  2. 视频录制:采集原始数据(例如:pcm yuv)->encoder(编码)->muxer(封装格式 例如:mp4 3gp)
  3. 流媒体协议:udp、rtp、rtmp、rtcp、rtsp等
  4. 音视频封装格式:mp4 、3gp、flv等
  5. 音视频编码格式:aac、amr、h264、h265等
  6. 原始音视频数据格式:pcm 、yuv、rgb等

流程图:

####文章目录:

  1. VideoView 视频播放控件
  2. camera配合surface预览相机画面和拍照
  3. MediaPlayer自定义视频播放器
  4. MediaRecorder音视频录制api
  5. AudioTrack原始音频pcm播放api
  6. AudioRecord原始音频pcm采集api

MediaRecorder是什么?
MediaPlayer类主要用于音频视频录制的api。现在有很多短视频app非常火爆,所以了解视频录制api是非常重要的,android自带多媒体录制api都是在硬编码(依靠硬件驱动编码)基础上进行封装,所以如果要达到专业级别的短视频应用开发工程师还要了解如何前置处理pcm 、jpg等处理算法。
首先视频音频录制是属于用户敏感信息,所以使用之前一定要申请权限:

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

这里构建一个demo app,使用mediarecorder api 录制mp4 视频文件,使用surfaceview 控件进行预览。

####效果图:

#####MediaRecorder api方法:

final static int getAudioSourceMax()

获取音频源的最大值。

int getMaxAmplitude()

获取在前一次调用此方法之后录音中出现的最大振幅。

void prepare()

准备录制。

void release()

释放资源。

void reset()

将MediaRecorder设为空闲状态,即Initial状态。

void setAudioChannels(int numChannels)

设置录制的音频通道数。

void setAudioEncoder(int audio_encoder)

设置所录制的声音的编码格式。

void setAudioEncodingBitRate(int bitRate)

设置所录制的声音的编码位率。

void setAudioSamplingRate(int samplingRate)

设置所录制的声音的采样率。

void setAudioSource(int audio_source)

设置声音来源,一般传入 MediaRecorder. AudioSource.MIC参数指定录制来自麦克风的声音。

void setCamera(Camera c)

设置一个摄像头用于录制。

void setCaptureRate(double fps)

设置视频帧捕获率。

void setLocation(float latitude, float longitude)

设置并存储在输出文件中的地理数据(经度和纬度)。

void setMaxDuration(int max_duration_ms)

设置录制会话的最长持续时间(以ms为单位)。

void setMaxFileSize(long max_filesize_bytes)

设置录制文件的最大文件大小。

void setOnErrorListener(MediaRecorder.OnErrorListener l)

注册一个用于记录录制时出现的错误的监听器。

void setOnInfoListener(MediaRecorder.OnInfoListener listener)

注册一个用于记录录制时出现的信息事件。

void setOrientationHint(int degrees)

设置输出的视频播放的方向提示。

void setOutputFile(FileDescriptor fd)

设置录制的音频文件的保存位置。

void setOutputFile(String path)

设置录制的音频文件的保存位置。

void setOutputFormat(int output_format)

设置所录制的音视频文件的格式。

void setPreviewDisplay(Surface sv)

设置使用哪个SurfaceView来显示视频预览。

void setProfile(CamcorderProfile profile)

指定CamcorderProfile对象。

void setVideoEncoder(int video_encoder)

设置所录制视频的编码格式。

void setVideoEncodingBitRate(int bitRate)

设置所录制视频的编码位率。

void setVideoFrameRate(int rate)

设置录制视频的捕获帧速率。

void setVideoSize(int width, int height)

设置要拍摄的宽度和视频的高度。

void setVideoSource(int video_source)

设置用于录制的视频来源。

void start()

开始录制。

void stop()

停止录制。

####基于MediaRecorder实现自定义录像机:

xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"><SurfaceViewandroid:id="@+id/surfaceView1"android:layout_width="fill_parent"android:layout_height="fill_parent"/><LinearLayoutandroid:layout_width="wrap_content"android:layout_gravity="bottom|center_horizontal"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:onClick="onClick"android:id="@+id/start_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="开始录制"/><Buttonandroid:onClick="onClick"android:layout_marginLeft="80dp"android:id="@+id/btnStop"android:layout_width="80dip"android:layout_height="wrap_content"android:text="停止录制"/></LinearLayout>
</FrameLayout>

java代码:

package com.jared.helloffmpeg;import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.Nullable;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Toast;public class RecordMP4Push extends Activity implements View.OnClickListener, SurfaceHolder.Callback {private SurfaceView surfaceView;private MediaRecorder mediaRecorder;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);setContentView(R.layout.record_aac_and_pcm);surfaceView=findViewById(R.id.surfaceView1);surfaceView.getHolder().addCallback(this);}@Overridepublic void onClick(View view) {if (view.getId()==R.id.start_btn){if (mediaRecorder!=null)return;// 刻录按钮try {mediaRecorder=new MediaRecorder();mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+System.currentTimeMillis()+".3gp");mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());mediaRecorder.prepare();mediaRecorder.start();Toast.makeText(getApplicationContext(), "录像", Toast.LENGTH_SHORT).show();} catch (Exception e) {Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();}}if (view.getId()==R.id.btnStop){if (mediaRecorder==null)return;mediaRecorder.stop();mediaRecorder.release();mediaRecorder=null;Toast.makeText(getApplicationContext(), "停止录像", Toast.LENGTH_SHORT).show();}}@Overridepublic void surfaceCreated(SurfaceHolder surfaceHolder) {}@Overridepublic void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {}@Overridepublic void surfaceDestroyed(SurfaceHolder surfaceHolder) {}
}

《android多媒体api》之MediaRecorder音视频录制api相关推荐

  1. Android 基于MediaCodec+MediaMuxer实现音视频录制合成

    AudioVideoCodec 一款视频录像机,支持AudioRecord录音.MediaCodec输出AAC.MediaMuxer合成音频视频并输出mp4,支持自动对焦.屏幕亮度调节.录制视频时长监 ...

  2. Android多媒体四:MediaRecorder录制视频短片

    Android多媒体四:MediaRecorder录制视频短片 MediaRecorder除了可用于录制音频之外,还可用于录制视频,使用MediaRecorder录制视频与录制音频的步骤基本相同. 只 ...

  3. Android OpenGL添加水印并录制视频--抖音视频录制原理

    Android OpenGL添加水印并录制视频–抖音视频录制原理 简单的视频录制,我们可以使用MediaRecorder,具体示例可以参考Gitee: Camera2VideoJava 本文将介绍采集 ...

  4. webrtc 入门第二章 音视频录制

    webrtc 入门第二章 音视频录制 一.介绍 1.媒体录制原理 ​ 在很多场景中回放音视频资源的需求是非常重要的例如会议,直播授课等.任何媒体形式的表情都可进行录制,如 ,,等.其中内容更加自由用户 ...

  5. 开发ASP.NET MVC 在线录音录像(音视频录制并上传)

    开发ASP.NET MVC 在线录音录像(音视频录制并上传) 最近有个在线招聘录音的开发需求,需要在招聘网站上让招聘者上传录音和视频. 找到两个不错的javascript开源,可以在除了IE以外的浏览 ...

  6. FFmpeg Android 学习(一):Android 如何调用 FFMPEG 编辑音视频

    一.概述 在Android开发中,我们对一些音视频的处理比较无力,特别是编辑音视频这部分.而且在Android上对视频编辑方面,几乎没有任何API做支持,MediaCodec(硬编码)也没有做支持.那 ...

  7. Java集成腾讯云音视频录制功能

    Java集成腾讯云音视频录制功能 为什么要实现音视频录制功能 因为我们做的是一个医院的项目,医生和患者可能进行视频通话和语音通话,为了保证通话的质量以及后续的问题, 我们就需要进行音视频录制,以便后续 ...

  8. 【愚公系列】2022年04月 微信小程序-实时音视频录制

    文章目录 前言 一.实时音视频录制 1.js代码 2.wxml代码 3.效果 前言 小程序的实时音视频播放需要先去微信开发者平台开通权限,「开发」-「接口设置」中自助开通该组件权限. 类目属性如下: ...

  9. javacv+远程视频直播+音视频录制+视频抓取

    远程视频直播+音视频录制+视频抓取 请首先阅读注意事项文末有github地址 远程直播展示 音视频录制 运行会有延迟,视频为mp4格式存储在D盘. 视频抓取 注意事项 远程直播需要下载一个软件:VLC ...

最新文章

  1. expected unqualified-id before numeric constant问题原因
  2. 启动 Tensorboard
  3. NTU 课程辅助笔记: NFA到DFA的转化
  4. 微服务为什么一定要用docker
  5. Node.js express 入门示例1
  6. Spark入门(十三)之分组求平均值
  7. linux elf 视频,linux 实例讲解elf文件
  8. JAVA设计模式初探之组合模式
  9. 浅谈CS0433的错误的类型
  10. iTunes怎么下载
  11. [转载] python函数——字典设置默认值get() 与 setdefault()区别
  12. 机器学习中训练集和测试集归一化(matlab版)
  13. 李沐老师的PyTorch 版《动手学深度学习》PDF 开源了(全中文,支持 Jupyter 运行)
  14. docker php示例,Docker 编程语言之 PHP
  15. Lightbox插件
  16. 电脑开机自动推送微信通知
  17. html五星评分标准,五星级酒店评分标准.doc
  18. 郑州龙发装饰公司告诉您:装修为什么要选择装
  19. 忘记安卓密码?教您轻松破解锁屏密码,解锁手机,简单易操作
  20. Linux系统的时间管理及优化

热门文章

  1. 小学计算机第二册教学计划,小学信息技术第二册上教学计划
  2. 二叉树-7.11 折纸
  3. Kali Linux 2021壁纸
  4. 从研招网爬取招生目录
  5. vue状态管理存取数据_Vuex的安装到使用,Vue框架数据和状态的管理神器
  6. java.sql.SQLException: Field 'Qid' doesn't have a default value
  7. java tabcontrol_TabControl的用法步骤详解
  8. 求最大子序列和的四种方法
  9. python内置函数之setattr() 函数
  10. 基于TensorFlow的VGG16模型源码