首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用 AudioTrack 播放音频轨道

在上篇文章 OpenGL ES 实现播放视频帧 中我们已经知道如何使用 GLSurfaceView 将解码后视频渲染到屏幕,但是,我们播放器还不具备音频播放功能,本篇文章中我们将使用 AudioTrack...AudioTrack 初始化 /** * Class constructor....开始播放 public void play() 如果 AudioTrack 创建时模式为 MODE_STATIC 时,调用 play 之前必须保证 write 方法已被调用。 5....暂停播放 public void pause() 暂停播放数据,尚未播放数据不会被丢弃,再次调用 play 时将继续播放。 6....接着我们监听到 INFO_OUTPUT_FORMAT_CHANGED 状态时,获取该音频轨道格式信息, MediaFormat 提供了足够信息可以让我们初始化 AudioTrack

2K31
您找到你想要的搜索结果了吗?
是的
没有找到

AudioTrack源码解读(2)

源码介绍 播放线程运行 首先从播放线程拉起开始,这儿以PlaybackThread为例, 由于PlaybackThread是以智能指针形式存在,因此创建后,会调用onFirstRef,因此这整个流程从这个函数开始...Play接口实现 public void play() throws IllegalStateException { if (mState !...= STATE_INITIALIZED) { throw new IllegalStateException("play() called on uninitialized AudioTrack...Stop实现 这儿直接从AudioTrack native实现看,可以猜想到这儿需要完成事情主要有调用Trackstop,并停止回调线程 void AudioTrack::stop() {...因为AudioFlinger中创建Track时候就分配了一块共享内存,并把内存fd 通过binder共享给了调用方,这样调用方就可以直接在这块内存获取可用内存了,具体实现如下: status_t

83720

Android音频系统AudioTrack使用方法详解

1、Android AudioTrack简介 android中播放声音可以用MediaPlayer和AudioTrack两种方案,但是两种方案是有很大区别的,MediaPlayer可以播放多种格式声音文件...事实,两种本质是没啥区别的,MediaPlayer播放音频时,framework层还是会创建AudioTrack,把解码后PCM数流传递给AudioTrack,最后由AudioFlinger进行混音..._ STEREO,   AudioFormat.ENCODING_PCM_16BIT,   bufsize, AudioTrack.MODE_STREAM);// trackplayer.play...STREAM意思是由用户应用程序通过write方式把数据一次一次得写到audiotrack中。...Android将系统声音分为以下几类常见写全): STREAM_ALARM:警告声 STREAM_MUSCI:音乐声,例如music等 STREAM_RING:铃声 STREAM_SYSTEM

3.6K51

AudioTrack和AudioRecord使用

本篇介绍 本篇介绍下AudioTrack和AudioRecord使用,通过AudioRecord录音,通过AudioTrack播放录制音频。...创建好后,调用startRecording就可以采集了。具体采集需要在单独线程里面做,调用AudioRecordread就可以,读出来内容就是采集数据,这儿是写到了一个文件里面。...AudioTrack使用 AudioTrack负责播放pcm数据,下面的代码是将刚采集pcm播放出来 AudioAttributes audioAttributes = new AudioAttributes.Builder...); tracker.play(); currentState = 2; executorService.submit(new Runnable() {...,也是需要指定采集位数,采集频率,输出声道,播放buffer,然后调用play就可以播放了,具体播放就是单独线程里面调用AudioTrackwrite即可。

43420

Android 音频PCM数据采集和播放,读写音频wav文件

PCM PCM是由模拟信号向数字信号转化一种常用编码格式,称为脉冲编码调制,PCM将模拟信号按照一定间距划分为多段,然后通过二进制去量化每一个间距强度。...PCM表示是音频文件中随着时间流逝一段音频振幅。AndroidWAV文件中支持PCM音频数据。 WAV WAV,MP3等比较常见音频格式,不同编码格式对应不通过原始音频。...获取wav文件 若要获得wav文件,需要在PCM基础增加一个header。可以将PCM文件转换成wav,这里提供一种PCM与wav几乎同时生成思路。...初始化AudioTrack时,要根据录制时参数进行设定。 代码示例 工具类WindEar实现音频PCM数据采集和播放,与读写音频wav文件功能。...*/ public static void init(Context context) { // 存储App内或SD卡 // cachePCMFolder

3.1K30

Android开发笔记(一百二十六)自定义音乐播放器

MediaRecorder/MediaPlayer Android手机上面,音频处理比视频还要复杂,这真是出人意料。...MediaRecorder与MediaPlayer处理音频和视频时,整体流程是一样,只有部分方法调用上有所差异,下面分别把录音/播音有关方法列出来。...该方法要在setVideoEncoder之前调用,不然调用setAudioEncoder时会报错“java.lang.IllegalStateException”。...SoundPool使用时可以事先加载多个音频,然后需要时候播放指定编号音频,这样处理有几个好处: 1、资源占用量小,不像MediaPlayer那么重; 2、延迟时间相对MediaPlayer...对于第三点歌曲控制栏,总体复用前一篇博文提到视频控制栏VideoController,博文名称是《Android开发笔记(一百二十五)自定义视频播放器》。

2.8K30

NDK--利用OpenSL ES实现播放FFmpeg解码后音频流

OpenSL ES是无授权费、跨平台、针对嵌入式系统 精心优化硬件音频加速API。当然安卓也使用了它,AudioTrack、MediaPlayer音频播放,底层都是利用OpenSL。...和AudioTrack相同,它只接受流,不支持音频数据编解码,所以需要结合第三方库来使用。 为什么要使用OpenSL?...一般应用使用安卓SDK提供API就足够满足使用,但对于专门音频播放APP,系统提供方法就有点力不从心了,比如:AudioTrack利用native层调用OpenSL,必不可免要进行java层流数据转化为...前面我们使用了FFmpeg解码音频流,并使用了java层AudioTrack进行播放,今天来实现在native层直接使用OpenSL播放。..., AudioFormat.ENCODING_PCM_16BIT, buffSize, AudioTrack.MODE_STREAM); audioTrack.play(); }

1.1K30

一种“ Android 设备,播放视频同时,获取实时音频流”有效方案

这篇文章将会按照一般需求开发流程,从需求、分析、开发,到总结,来给大家讲解一种“ Android 设备,播放视频同时,获取实时音频流”有效方案。...一、需求 在车载产品,有这样一种需求,比如我把我Android设备通过usb线连接上车机,这时我希望我我Android手机上操作,能同步到车机大屏上进行显示。...接下来我们再了解下,Android系统,声音播放流程是怎样?这对我们如何去获取视频播放时候音频流,很有帮助。 我们先看下关于视频播放、录音,Android给我们提供了哪些API?...从上面的音频系统框架图(看画红线部分),我们可以知道,应用上调用MediaPlayer、MediaRecorder来播放、录音,framewrok层会调用AudioTrack.cpp这个文件。...,就是framework层AudioTrack.cpp文件中,通过socket,把音频流实时发送出来。

2K40

Android多媒体之认识声音、录音与播放(PCM)

一个采样存储空间,常用16bit (0-65535)振幅 采样率 :采样频率 8K、16K、32k、(AAC)44.1K、48K(1s模拟信号采集48K次) 20Hz 频率即1s振动20次,使用...听觉频率与发生频率对比图.jpg ---- 2.人耳“掩蔽效应”:参见--音视频知识-掩蔽效应 人并不是85Hz~1100Hz所有的声音都是能听到,还要取决于响度 当频率很低时候需要更大响度...(振幅)才能被听到 最简单响度-频率关系图如下(图是我用ps修,如果有误,欢迎指正): 可见3KHz~5KHz阀值较小,也就是更容易听到 ?...响度-频率曲线.jpg ---- 当某个时刻响起一个高分贝声音,它周围会出现遮蔽区域 如在轰鸣机械运转中(红色),工人普通语言交流(灰色)是困难 遮蔽区域内声音人耳是无法识别的,这时可以提高音量...= -1) {// audioTrack.play(); audioTrack.write(tempBuffer

3.4K30

Android FFmpeg系列05--音频解码与播放

FFmpeg系列04--FFmpeg调用MediaCodec进行硬解码 本篇文章将通过音频基础、AudioTrack、FFmpeg音频解码&重采样三个部分讲解来完成对Demo中mp4文件内音频流解码与播放功能...DO NOT USE if linking dynamically }; 以双声道为例,planar格式存储时,左右声道数据分开存储,左声道data[0],右声道数据data[1],每个声道所占用字节数为...linesize[0]和linesize[1] packed格式则按照LRLRLR...格式交错存储data[0]中,总数据量为linesize[0] eg:双声道AV_SAMPLE_FMT_S16...play() 实时写入数据 mAudioTrack?.write(audio, 0, size) 释放 mAudioTrack?.stop() mAudioTrack?....,可以查看源码中AudioDecoder.cpp 这里重点说说重采样过程 初始化重采样上下文 mSwrContext = swr_alloc_set_opts( nullptr,

1.2K20

Android音频播放(本地网络)绘制数据波形,根据特征有节奏改变颜色

),包含了音视频播放,音视频录制等...但是还有一个被遗弃熊孩子AudioTrack,这个因为太不好用了而被人过门而不入(反正肯定不是因为懒),这Android多媒体四大家族就齐了,MediaPlayer...MP3波形数据提取 当那位小伙提出这个需求时候,我就想起了AudioTrack这个类,和AudioRecord功能使用方法十分相似,使用时候初始化好之后对数据buffer执行write就可以发出呻吟了...下面直接看代码吧,都有注释(真的不是懒得讲╮(╯_╰)╭): 流程就是定义好buffer,初始化MediaExtractor来获取数据,MediaCodec对数据进行解码,初始化AudioTrack播放数据...因为一期波形播放数据是short形状,所以我们为了兼容就把数据转为short,这里要注意合成short可能有大小位问题,然后计算音量用于提取特征值。...); //开始play,等待write发出声音 audioTrack.play(); extractor.selectTrack(0);//选择读取音轨 // start decoding final

3.2K20

Android多媒体之SoundPool+pcm流音频操作

PCM采集数据需要AudioTrack播放,AudioTrack也可以将PCM数据转换成其他格式 ---- 1.1:音频来源:int audioSource ?...MODE_STATIC:适合小文件 所有数据通过一次write调用传递到AudioTrack内部缓冲区。 这种模式适用于像铃声这种内存占用量较小,延时要求较高文件。 ?...编码方式.png ---- 4.MediaPlayer MediaPlayer可以播放多种格式声音文件(mp3,w4a,aac) MediaPlayerframework层也实例化了AudioTrack..., 其实质是MediaPlayerframework层进行解码后,生成PCM流,然后代理委托给AudioTrack, 最后AudioTrack传递给AudioFlinger进行混音,然后才传递给硬件播放...资源文件.png ---- 1.初始化 做一个两个音效每次点击依次播放一个效果 private SoundPool mSp; private HashMap mSoundMap

2.7K20

android语音即时通讯之录音、播放功能实现代码

android中,实现录音与语音播放功能算是比较简单,但是作为参考,还是很有必要将语音相关知识做一个简要记录。 首先,android中,支持录音支持两种方式。...一般来说,录音功能实现是jin层,而在这一层中,是用单线程实现。如果我们在编码对录音api进行多线程操作,会导致程序直接闪退,并且我们是无法java层对其异常进行捕获。...这一部分我们实现主要是sdcrad根目录下新建一个voice目录,然后新建一个以==.m4a==为后缀名文件。配置mAudioRecord相关参数后,将收集到录音存放到之前文件中。...这里mHander是一个局部变量,其初始化放在OnCreate()方法中。...inputStream = new FileInputStream(mAudioFile2); int read; //循环读取数据,写到播放器去播放 audioTrack.play

1.2K20
领券