【发布时间】:2015-07-11 06:50:29
【问题描述】:
我已经被这个问题困扰了好几天了。我现在正处于一个阶段,我只是想从一个可行的例子中构建,但我什至无法达到这一点。
我的问题基于this example。我已将源代码(和解决方案)包含在自己的代码中,并且可以看到缓冲区正在被写入,但设备没有声音。我正在努力确定如何进一步调试。
package com.example.audio;
import com.example.R;
import java.io.IOException;
import java.io.InputStream;
import android.content.Context;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.util.Log;
public class Synth {
private static final String TAG = Synth.class.getSimpleName();
private AudioTrack audioTrack;
private Context context;
public Synth(Context context) {
this.context = context;
int minBufferSize = AudioTrack.getMinBufferSize(22050, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 22050, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM);
}
public void playSound() {
audioTrack.play();
int i = 0;
int bufferSize = 512;
byte [] buffer = new byte[bufferSize];
InputStream inputStream = context.getResources().openRawResource(R.raw.mysample);
try {
int writes = 0;
while((i = inputStream.read(buffer)) != -1) {
writes++; audioTrack.write(buffer, 0, i);
}
Log.d(TAG, "Wrote " + writes + " times." );
} catch (IOException e) {e.printStackTrace();}
try {inputStream.close();} catch (IOException e) {e.printStackTrace();}
}
}
(复制项目:新建项目,包含这个类,添加下面提到的音频,创建Synth的实例,然后触发playSound公共函数)
显然我无法上传音频,或者保证它在网络文件夹中的持久性,但是this tool will generate a WAV file exactly like I am using(将采样率更改为 22.05kHz 并按“下载 .wav 文件”)
我意识到 STREAM_MUSIC 和 MODE_STREAM 在此示例中似乎不合适。我正在使用这些标志/模式,因为我知道我需要在开发后期将 AudioTrack 与这些模式一起使用,并且实际上只是暂时尝试从设备中发出声音。
谁能建议调试步骤,或者看看播放有什么问题?任何帮助表示赞赏。
【问题讨论】:
-
它对我有用。声音是分段的(当我在
VLC中打开wav文件时,它很流畅),但它播放something。我还必须删除import com.example.R,但除此之外,我还复制粘贴了您的执行代码。您确定可以在VLC或Media Player中播放该文件吗?您是否在设备/计算机中检查了您的audio settings(我使用了模拟器)? -
哇,这很尴尬。我尝试了我在帖子中建议的示例并且它有效,然后我尝试了我的原始示例并且它有效。我不知道发生了什么。这太令人沮丧了!有什么想法会发生什么吗?我的代码示例完全未经编辑,因为我被卡住了!实际上我正在使用一个设备。嗯。我不确定在这种情况下该怎么做,因为这个问题并不是真正的问题..
-
我不知道。有时它是纯粹的巫术......
-
感谢您的帮助!我会给你“正确答案”,但我担心版主会认为这只是点耕作之类的。我最好自我回答,代码按写的那样工作。
-
PS - 我现在在“真实”设备上进行了测试,与模拟器不同,音频很流畅。
标签: java android audio inputstream audiotrack