Android音频视频

本文介绍了Windows平台上的音频编程方法,包括MCI、低级音频API和DirectSound,并探讨了使用低级音频函数进行实时音频处理的技术细节。

MediaPlayer

播放音频和控制音效。

Android 8对MediaPlayer的功能进行了增强--从Android 8开始,MediaPlayer提供了方法
来支持播放带数字版权保护(DRP)的媒体文件。

Android9对MediaPlayer进行了增强,它内置了HDRVP9视频预的本地解码器,可以直接使用Android本地解码器来播放HDR视频。

音乐特效控制

Android可以控制播放音乐时的均衡器、重低音、音场及显示音乐波形等,这些都是靠AudioEffect及其子类来完成的,它包含如下常用子类。

  • AcousticEchoCanceler:取消回声控制器。
  • AutomaticGainControl:自动增益控制器。
  • NoiseSuppressor:噪音压制控制器。
  • BassBoost:重低音控制器。
  • Equalizer:均衡控制器。
  • PresetReverb:预设音场控制器。
  • Visualizer:示波器。

使用VolumeShaper控制声音效果

Android8新增了VolumeShaper来控制声音效果,VolumeShaper可实现音量的淡入、淡出等自动音量转换效果。

SoundPool

如果应用程序经常需要播放密集、短促的音效,这时还用MediiaPlayer就显得有些不合适了。
MediaPlayer存在如下缺点:

  • 资源占用量较高,延迟时间较长。
  • 不支持多个音频同时播放。

SoundPool使用音效池的概念来管理多个短促的音效,例如它可以开始就加载20个音效,以后在程序中按音效的ID进行播放。
SoundPool主要用于播放一些较短的声音片段,与MediaPlayer相比,SoundPool的优势在于CPU资源占用量低和反应延迟小。另外,SoundPool还支持自行设置声音的品质、音量、播放比率等参数。

实际使用SoundPool播放声音时有如下几点需要注意:SoundPool虽然可以一次性加载多个声音,但由于内存限制,因此应该避免使用SoundPool来播放歌曲或者做游戏背景音乐,只有那些短促、密集的声音才考虑使用SoundPool进行播放。
虽然SoundPool比MediaPlayer的效率好,但也不是绝对不存在延迟问题,尤其在那些性能不太好的手机中,SoundPool的延迟问题会更严重。

VideoView

VideoView组件是一个位于android.widget包下的组件,它的作用与ImageView类似,InageView用于显示图片,VideoView用于播放视频。

与VideoView一起结合使用的还有一个MediaController类,它的作用是提供一个友好的图形控制界面,通过该控制界面来控制视频的播放。

MediaPlayer+SurfaceView播放视频

MediaPlayer主要用于播放音频,它没有提供图像输出界面,此时需要借助于SurfaceView来显示MediaPlayer播放的图像输出。

使用MediaPlayer播放视频要复杂一些,需要自己开发控制按钮来控制视频播放,一般推荐使用VideoView来播放视频。

相机也需要一个界面来预览拍摄效果,可以使用SurfaceView类。

MediaRecorder录制音频

MediaRecorder可用于录制音频。

MediaRecorder除可用于录制音频之外,还可用于录制视频。使用MediaRecorder录制视频与录制音频的步骤基本相同。只是录制视频时不仅需要采集声音,还需要采集图像。为了让MediaRecorder录制时采集图像,应该在调用setAudioSourcee(intaudio_source)方法时再调用setVideoSource(int videoSource)方法来设置图像来源。
除此之外,还需要在调用setOutputFormat()方法设置输出文件格式之后执行如下步骤。

  • 调用MediaRecorder对象的setVideoEncoder()、setVideoEncoddingBitRate(int bitRate)、setVideoFrameRate()方法设置所录制的视频编码格式、编码立率、每秒多少帧等,这些参数可以控制所录制的视频品质、文件大小。一般来说,视频品质越好好,视频文件越大。
  • 调用MediaRecorder的setPreviewDisplay(Surfacesv)方法设置使用哪个SurfaceView来显示视频预览。

剩下的代码则与录制音频的代码基本相同。

Android 5.0的Camera v2拍照

Android5.0(API 级别 21)对拍照API进行了全新的设计,新增了全新设计的Camerav2API。Android 9改进的Camerav2API不仅大幅提高了Android系统拍照的功能,还支持RAW照片输出,甚至允许程序调整相机的对焦模式、曝光模式、快门等。Android5.0的Camerav2主要涉及如下API:

  • CameraManager:摄像头管理器。用于检测系统摄像头、打开系统摄像头。CameraManager提供了getCameraIdList()方法来获取设备的摄像头ID列表,还提供了getCameraCharacteristics(String cameraId)方法来获取指定摄像头的特性。
  • CameraCharacteristics:摄像头特性。该对象通过CameraManager来获取,用于描述特定摄像头所支持的各种特性。
  • CameraDevice:代表系统摄像头。
  • CameraCaptureSession:需要于预览、拍照时,需要先通过该类的实例创建Session。预览和拍照都是由该对象的方法进行控制,其中控制预览的方法为setRepeatingRequest();控制拍照的方法为capture()。为了监听CameraCaptureSession的创建过程,以及监CameraCaptureSession的创建ptureSession的拍照过程,Camerav2API为CameraCaptureSession提供了StateCallback、CaaptureCallback等内部类。
  • CameraRequest:当程序调用 setRepeatingRequest()方法进行预览时,或调用capture()方法进行拍照时,都需要传入CameraRequest参数。CameraRequest代表了一次捕获请求,用于描述捕获图片的各种多参数设置,比如对焦模式、曝光模式,程序需要对照片所做的各种控制,都那通过CameraRequest参数进行设置。

Android9对相机API做了进一步增强,它可以同时从两个或更多的物理摄像头来获得数据流(对目前的双摄像头、多摄像头提供支持)。在支持双摄像头或多摄像头的设备上,增强的相机API可以实现单个摄像头无法实现的功能,例如无缝缩放、散景和立体效果等。增强后的相机API还允许调用合适或融合的相机数据流,以便在不同的摄像头之间切换自如。

屏幕捕捉

如果开发者要对Android屏幕进行实时截图,则可以使用Android提供的MediaProjectionManager
管理器,该管理器可以非常方便地实现屏幕捕捉功能。

Android5.0新增了MediaProjectionManager管理器,实现屏幕捕捉功能。

Camera V2

Camera V2 是 Android 5.0(API 级别 21)起引入的‌官方相机开发框架‌。

‌定位‌:Android 系统级的相机 API,用于开发相机应用。
‌适用设备‌:主要用于控制手机或平板等 Android 设备‌内置的摄像头模组‌。
‌功能特点‌:
支持精细控制曝光、对焦、白平衡等参数。
支持多摄像头切换(前置、后置、广角等)。
提供相机特性查询、捕获请求、图像流处理等高级功能。
通过 android.hardware.camera2 包进行开发。
‌开发方式‌:开发者通过 Java/Kotlin 调用 Camera2 API,与系统相机服务交互。

CameraX

CameraX 是 Android Jetpack 中的一个相机库,基于 Camera V2 构建,为开发者提供了更高层次的抽象和简化的 API。CameraX 是在 Camera2 基础上构建的更高层次的库,旨在简化相机操作,提供更方便的 API,降低学习曲线。

UVC Camera‌

在 Android 开发中,‌Camera V2‌ 和 ‌UVC Camera‌ 是两个不同层面的概念,前者是 Android 系统提供的相机开发框架,后者是一种遵循 USB 协议标准的外部摄像头设备。

UVC(USB Video Class)是一种‌USB 协议标准‌,允许即插即用的 USB 视频设备(如网络摄像头)无需安装专用驱动即可被主机识别和使用。

‌定位‌:一种‌硬件通信协议标准‌,不是 Android 的 API。
‌适用设备‌:指通过 USB 接口连接到 Android 设备的‌外部摄像头‌,如 USB 网络摄像头。
‌功能特点‌:
Android 设备作为 USB 主机,识别并使用外接的 UVC 摄像头。
通常用于视频通话、直播、监控等场景。
需要应用支持 UVC 协议,如使用第三方库(如 libuvc 或 UVCCamera 库)进行开发。
‌开发方式‌:开发者需使用专门的 UVC 库(如 Serenegiant/UVCCamera)来枚举、打开、配置和捕获 UVC 设备的视频流。Android 系统本身不提供像 Camera2 那样统一的 UVC 管理 API。

Android 设备本身也可以被配置为一个 UVC 设备,即当它通过 USB 连接到电脑时,电脑可以将其识别为一个网络摄像头。这需要在 Android 设备上启用 USB UVC 功能,可通过命令 adb shell svc usb setfunctions uvc 实现,或在开发者选项中开启相关设置 。

Camera V2 是用来控制手机自己的摄像头的软件接口,UVC Camera 是指连接到手机的外部 USB 摄像头,或手机本身被当作一个 USB 摄像头使用‌。

Windows 音频编程主要有三种方式

1.MCI,这种方式很简单,但是不够灵活 
2.waveXXXX等低阶的声音API 
3.DirectSound 

编写一个功能较强大的音频处理程序,那就必须使用低级音频函数和多媒体文件I/O来控制音频设备的输入和输出。因为低级音频函数可直接与音频驱动程序交互,通过窗口消息或回调(CALL BACK)函数来管理音频数据块的记录和播放,控制非常灵活。重要的一点是,低级音频函数为我们提供了一个设备无关的接口。

音频数据文件WAVE结构分析--Windows XP 启动.wav 文件头分析 

http://blog.csdn.net/c_huabo/article/details/5984402

我遇到的死锁是由于当执行WaveInReset函数时,回调函数仍然在调用WaveInAddBuffer才产生的,所以只要设置标示符,使将要执行WaveInReset函数之时及以后回调函数不调用WaveInAddBuffer即可避免死循环,另外不要忘了在调用WaveInReset之前调用WaveInStop函数。

http://www.docin.com/p-159437153.html
http://www.docin.com/p-327123929.html
http://blog.csdn.net/joyzml/article/details/5381143
请教关于实时录音/放音的问题

http://bbs.csdn.net/topics/99939

基于WaveX低级音频函数的实时语音通信

http://www.wavecn.com/content.php?id=95

http://www.programfan.com/article/729.html

http://www.cnblogs.com/linbc/archive/2009/03/18/1415936.html

波形示意软件

http://www.m5home.com/bak_blog/article/282.html

android录音与示波器

http://jim443.iteye.com/blog/1666087

vc画波形图

http://bbs.csdn.net/topics/100137205

Fundamentals of Sound: How to Make Music out of Nothing at All

WAV文件的格式:

WAV文件,由WAV文件头和音频采样数据组成。由文件头可以得知该文件的音频采样数据的相关信息(声道数,采样率,采样数据的位数等)  声道数最多2个声道,2个声道也就是立体声。得到文件头信息后,把采样数对应坐标画上去即可。

format.wFormatTag       =WAVE_FORMAT_PCM;   //格式为PCM  

format.nChannels        =1;                 //单声道,2是立体声 

format.nSamplesPerSec   =11025;             //采样率 

format.nAvgBytesPerSec  =11025;         //数据率

format.nBlockAlign      =1;                 //每样点的字节数 

format.wBitsPerSample   =8;             //采样精度

format.cbSize           =0; 

WAV档案格式
偏移量 
位元组 
资料
0000
4
「RIFF」
0004
4
波形块的大小(档案大小减8)
0008
4
「WAVE」
000C
4
「fmt 」
0010
4
格式块的大小(16位元组)
0014
2
wf.wFormatTag = WAVE_FORMAT_PCM = 1
0016
2
wf.nChannels
0018
4
wf.nSamplesPerSec
001C
4
wf.nAvgBytesPerSec
0020
2
wf.nBlockAlign
0022
2
wf.wBitsPerSample
0024
4
「data」
0028
4
波形资料的大小
002C
波形资料
这是一种扩充自RIFF(Resource Interchange File Format:资源交换档案格式)的格式。RIFF是用於多媒体资料档案的万用格式,它是一种标记档案格式。在这种格式下,档案由资料「块」组成,而这些 资料块则由前面4个字元的ASCII名称和4位元组(32位元)的资料块大小来确认。资料块大小值不包括名称和大小所需要的8位元组。
波形声音档案以文字字串「RIFF」开始,用来标识这是一个RIFF档案。字串後面是一个32位元的资料块大小,表示档案其余部分的大小,或者是小於8位元组的档案大小。
资料块以文字字串「WAVE」开始,用来标识这是一个波形声音块,後面是文字字串「fmt」-注意用空白使之成为4字元的字串-用来标识包含 波形声音资料格式的子资料块。「fmt」字串的後面是格式资讯大小,这里是16位元组。格式资讯是WAVEFORMATEX结构的前16个位元组,或者, 像最初定义时一样,是包含WAVEFORMAT结构的PCMWAVEFORMAT结构。
格式资讯的後面是文字字串「data」,然後是32位元的资料大小,最後是波形资料本身。这些资料是按相同格式进行简单连结的样本,这与低阶 波形声音设备上所使用的格式相同。如果样本大小是8位元,或者更少,那么每个样本有1位元组用於单声道,或者有2位元组用於立体声。如果样本大小在9到 16位元之间,则每个样本就有2位元组用於单声道,或者4位元组用於立体声。对於立体声波形资料,每个样本都由左值及其後面的右值组成。

用完设备之后,必须调用waveOutClose函数关闭波形输出设备,以便其他程序可以使用设备。

示波器中的波形图就是每个采样点对应的坐标点连起来的,这个坐标点可以是声音大小。就是每个采样的值,幅度。

点击音效

在页面视图根布局中增加配置 android:soundEffectsEnabled="true"

RingtoneManager 

RingtoneManager 是 Android 系统中用于‌管理铃声、通知音和闹钟声音‌的核心类(位于 android.media 包),它负责查询媒体提供者并返回统一的游标或 Ringtone 对象 。‌‌

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值