我有AudioTrack通过耳机流媒体.我必须只发送一个SoundPool内置扬声器,而不会打断AudioTrack耳机播放.任何黑客歹徒?
问题: 有没有办法使用AudioTrack和setLoopPoints()来配置基于每毫秒样本/帧精度的循环?
编辑:我知道大多数Android设备拥有的处理能力无法预期完美的准确性.但是,我希望平均循环时间接近速度的"真实"间隔(以毫秒为单位),因为这是我基于"动画"的方式,它也应该与速度同步(动画是一个重绘的SurfaceView)一段线在节奏间隔期间的坐标).
详细信息: 我正在尝试使用带有setLoopPoints的AudioTrack来创建准确的节拍器.为此,我使用两个wav文件(Tick和Tock)来填充byte []数组以提供给AudioTrack.考虑一下4/4时间的例子,我将填充一个byte [],一次使用Tick从[0]开始,三次使用Tock(使用arrayCopy())填充[length/4],[length/2]和[3*length/4],并假设wav数据不会相互重叠.
我的代码所做的粗略示例:
// read each wav file's header into its own ByteBuffer (with LITTLE_ENDIAN order)
// ... then get the size of the audio data
tickDataSize = tickHeaderBuffer.getInt(40);
tockDataSize = tockHeaderBuffer.getInt(40);
// allocate space for one loop at the current tempo into a byte[] array (to be given to AudioTrack)
// e.g. 22050hz * 2 Bytes (1 per channel) * 2 Bytes (1 per 8 bit PCM sample) = 22050*4 Bytes/second
// If …Run Code Online (Sandbox Code Playgroud) 我已经在互联网上到处搜索了解决方案,但似乎找不到确切的答案。
基本上,我希望在android平台上实现3D音频环境。我正在寻找的是一个能够使用类似坐标系的东西将声音放置在虚拟空间中的android库。
我知道iOS具有OpenAL,但是否有Android等效产品?我也知道AudioTrack该类的存在,但是我正在寻找一些不太原始的东西。
提前致谢。
我想用AudioTrack从SD卡播放音频文件.我试过这段代码:
int minBufferSize = AudioTrack.getMinBufferSize(8000,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
int bufferSize = 512;
AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 8000,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, minBufferSize,
AudioTrack.MODE_STREAM);
int i = 0;
byte[] s = new byte[bufferSize];
FileInputStream fin = new FileInputStream(path);
DataInputStream dis = new DataInputStream(fin);
at.play();
while ((i = dis.read(s, 0, bufferSize)) > -1)
{
at.write(s, 0, i);
}
at.stop();
at.release();
dis.close();
fin.close();
Run Code Online (Sandbox Code Playgroud)
但它不能正常播放音频文件.它不是原始音频,而是播放某种噪音.
我正在尝试使用AudioTrack类播放合成声音(基本上是2个正弦波和一些噪声).它似乎与javax.sound.sampled中的SourceDataLine没有任何不同,但合成真的很慢.即使对于ARM标准,认为32768个样本(16位,立体声,总共65536)在Nexus 4上渲染需要1秒钟(用System.nanotime()测量,写入AudioTrack除外)是不现实的.合成部分与此http://audioprograming.wordpress.com/2012/10/18/a-simple-synth-in-android-step-by-step-guide-using-the-java-sdk/几乎完全相同,唯一的区别是我播放立体声(我无法将其降低为单声道,因为它是双耳音).
有任何想法吗?我能做什么?
提前致谢
I have a streaming server running on localhost. When I try to stream audio from it from my Android application. I'm getting static noise most of the time (The kind you get on radio). Sometimes the complete audio is static noise, sometimes a part of it, and sometimes the audio plays just fine, so I'm not sure what's going wrong.
Here's the streaming code from my android application:
new Thread(
new Runnable() {
@Override
public void run() {
try { …Run Code Online (Sandbox Code Playgroud) 我有一个例子,我正在使用MediaCodec解码mp3音频,以便使用MediaPlayer和AudioTrack进行播放.该示例使用的是getInputBuffers(),现在已在API 21+中进行了描述.新的getInputBuffer(int index)返回一个缓冲区而不是数组,MediaCodec的API引用仍然显示getInputBuffers()的用例.
任何人都可以解释我需要如何使用新方法?我每次只得到索引0吗?我开始循环并获取每个并创建一个数组但是没有一个地方,我已经看到,我可以获得可用缓冲区的长度.
我正在为 chrome 商店构建一个屏幕录像机插件。我正在将麦克风的音轨添加到包含(屏幕的视频轨道 + 系统音轨)的媒体流中。所以最终流包含 2 个音轨,一个是麦克风,另一个是系统音频。
当我将此流传递给 MediaRecorder(stream) 时,与最终视频相比,我只能收听stream.getAudioTracks() 中索引为 0 的单个音频,即 MediaRecorder 仅录制单个音轨。
那么如何使用 MediaRecorder 录制包含多音轨的流呢?
我看到许多资源建议AudioTrack.getTimestamp()在现代 Android 版本上使用来计算音频/视频同步的音频延迟。
例如:
https://developer.amazon.com/docs/fire-tv/audio-video-synchronization.html#section1-1
https://groups.google.com/forum/#!topic/android-platform/PoHfyNK54ps
但是,这些都没有解释如何使用时间戳来计算延迟?我正在努力弄清楚如何处理时间戳的framePosition/nanoTime 来得出延迟数字。
我正在编写一个 Android 程序,将 MIC 直接流式传输到手机扬声器。代码可以工作,但 UI 挂起并且应用程序挂起。但是即使应用程序挂起,音频传输仍然可以工作。错误在哪里..?
RecordBufferSize=AudioRecord.getMinBufferSize(sampleRateInHz,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT);
TrackBufferSize= AudioTrack.getMinBufferSize(sampleRateInHz,AudioFormat.CHANNEL_OUT_MONO,AudioFormat.ENCODING_PCM_16BIT);
am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
Record record = new Record();
record.run();
}
public class Record extends Thread
{
final short[] buffer = new short[RecordBufferSize];
short[] readBuffer = new short[TrackBufferSize];
public void run() {
isRecording = true;
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
AudioRecord arec = new AudioRecord(MediaRecorder.AudioSource.MIC,sampleRateInHz,AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,RecordBufferSize);
AudioTrack atrack = new AudioTrack(AudioManager.STREAM_MUSIC,sampleRateInHz,AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, TrackBufferSize, AudioTrack.MODE_STREAM);
//am.setRouting(AudioManager.MODE_NORMAL, AudioManager.ROUTE_EARPIECE, AudioManager.ROUTE_ALL);
atrack.setPlaybackRate(sampleRateInHz);
byte[] buffer = new byte[RecordBufferSize];
arec.startRecording();
atrack.play();
while(isRecording) {
AudioLenght=arec.read(buffer, 0, RecordBufferSize);
atrack.write(buffer, 0, AudioLenght);
} …Run Code Online (Sandbox Code Playgroud) audiotrack ×10
android ×9
audio ×4
java ×1
mediacodec ×1
mediastream ×1
mp3 ×1
openal ×1
opensl ×1
pcm ×1
soundpool ×1
streaming ×1