目前我正在使用AudioTrack传递来自本机层的音频数据来播放.
我似乎可以在本机层使用OpenSL ES而不是Java中的AudioTrack.与AudioTrack相比,OpenSL ES提供了哪些优势?
我在我的项目中集成了ffmpeg lib,我也可以获取媒体文件的信息.但现在我必须使用ffmpeg lib在android中使用AudioTrack类播放mp3文件.
为此,我必须将字节缓冲区传递给AudioTrack,但我不知道如何从ffmpeg获取字节缓冲区并将其与AudioTrack一起使用.我也希望立即播放文件.
这是我在java中的音轨代码:
AudioTrack track;
bufferSize = AudioTrack.getMinBufferSize(44100,AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT)
track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize, mode);
//Play audio clip
track.play();
while(stream_is_over){
//Copy the decoded raw buffer from native code to "buffer" .....
............
track.write(buffer, 0, readBytes);
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以给我工作代码播放带音轨的mp3文件.我搜索了很多,但没有找到任何正确的答案.
当我们需要流音频时,没有太多关于应用此编解码器的信息.如果不应用编解码器,我的代码就像在两个设备之间建立通信的魅力一样,但我需要以该格式进行编码/解码,因为我需要与服务器进行流式处理而不是两个设备之间的流式传输(我使用2个设备测试此代码).
我正在寻找机会,如果你的任何人都能看到问题的关键在哪里.我尝试了不同的输入参数配置.也许,我使用的编解码器是错误的(我从一个带有Apache许可证的项目中获取它们.)
此值在录制器发送器中设置,如播放器 - 接收器设备中所示:
private int port=50005;
private int sampleRate = 8000 ;//44100;
private int channelConfig = AudioFormat.CHANNEL_OUT_MONO;
private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int minBufSize = AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat);
Run Code Online (Sandbox Code Playgroud)
注意:播放器中的CHANNEL_OUT_MONO和录像机项目中的CHANNEL_IN_MONO.
这些是我的方法:
public void startStreamingEncoding() {
Thread streamThread = new Thread(new Runnable() {
@Override
public void run() {
try {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
DatagramSocket socket = new DatagramSocket();
short[] buffer = new short[minBufSize];
DatagramPacket packet;
final InetAddress destination = InetAddress.getByName(ip_receiver);
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,sampleRate,channelConfig,audioFormat,minBufSize*10);
recorder.startRecording();
/////Encoding:
Encoder encoder = new G711UCodec();
byte[] …Run Code Online (Sandbox Code Playgroud) 我正在使用AudioTrack一系列正弦波,但是当我在HTC M9上运行它时,它只播放部分样本,并且它将播放多长时间是随机的.例如我有20个音调可以播放,但它只播放2到17.5个音调.是的,它甚至会在音调中间停止.
这是我的代码,来自另一个答案:
ArrayList<double[]> samples = new ArrayList<>();
int numSamples = 0;
for (final ToneSegment seg : sequence) {
int num = seg.getDuration() * sampleRate / 1000;
double[] sample = new double[num];
for (int i = 0; i < num; ++i) {
sample[i] = Math.sin(2 * Math.PI * i * seg.getPitch() / sampleRate);
}
samples.add(sample);
numSamples += num;
}
byte generatedSnd[] = new byte[2 * numSamples];
int idx = 0;
for (double[] sample : samples) {
for (final …Run Code Online (Sandbox Code Playgroud) 我正在使用音频轨道以流模式播放不同的声音.我想知道是否有办法知道每个声音的生命/结束时间.
我像这样创建音轨:
AudioTrack tmpAudioTrack = new AudioTrack(
STREAM_TYPE,
SAMPLE_RATE,
CHANNEL_CONFIG_TYPE,
AUDIO_FORMAT_TYPE,
getOptimalBufferSize(),
AUDIO_TRACK_MODE);'
Run Code Online (Sandbox Code Playgroud)
并在后台线程中启动它:
backround_thread = new Thread(new MyRunnable(aTrack));
backround_thread.start();
Run Code Online (Sandbox Code Playgroud)
我在runnable中写出这样的每个声音:
byte generatedSnd[] = new byte[2 * beepSamples];
<code for filling the buffer with sound here>
int bytesWritten = track.write(generatedSnd, 0, generatedSnd.length);
Run Code Online (Sandbox Code Playgroud)
可以使用任何AudioTrack API,如setNotificationMarkerPosition,setLoopPoints或setPositionNotificationPeriod来完成此操作吗?它们是如何工作的?
每个声音可以是不同的持续时间.我认为这是关键.
我不完全理解这些API的文档.每个框架是否与样本相同?如何为每个声音的开始/结束位置指定标记?
谢谢,
我正在使用AudioTrack播放我通过UDP套接字收到的声音.我和声音一起发出很多噪音,所以我决定使用AudioManager.但是AudioManager会将声音路由更改为超出应用程序的范围.以下是我正在使用的代码.
m_amAudioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
m_amAudioManager.setMode(AudioManager.MODE_IN_CALL);
m_amAudioManager.setSpeakerphoneOn(false);
Run Code Online (Sandbox Code Playgroud)
这段代码的问题在于,当我关闭应用程序并启动音乐播放器时,声音来自前置扬声器而不是后置扬声器,我不能以某种方式改变它.要解决此问题,我决定在关闭应用时添加以下行.
m_amAudioManager.setSpeakerphoneOn(true);
Run Code Online (Sandbox Code Playgroud)
但是对于这条线,问题是当我接到一个电话(正常通话)时,默认情况下扬声器开启.我真的需要帮助.
我正试图通过接入点使用WiFi将MP3从Android手机流式传输到另一部Android手机.问题是OpenSL ES似乎只支持PCM音频缓冲区作为源(除非使用URI).而不是在发送之前解码"主"侧的潜在巨大文件我宁愿让"客户端"将MP3解码为PCM.请记住,这必须作为文件流发生,而不是简单地发送整个文件然后解码.有没有办法使用OpenSL ES来实现这一目标?AudioTrack?这似乎是一个相当普遍的要求.
我已经构建了一个简单的音乐音序器Android应用程序,可播放多个音频文件.
最初我使用的是SoundPool播放mp3文件,它在2.3.4版本上与旧的HTC Droid Incredible完美配合.然后我在运行4.3的Galaxy Nexus上进行了测试,性能非常糟糕.整个地方的音频定时,有毛刺/点击/弹出.
因此,我花了几天时间制作一个使用AudioTrack的播放器,包括一个mp3解码器,让它在Galaxy和HTC上完美运行.现在我刚刚在Nexus 4(运行4.3)上进行了测试,性能非常糟糕 - 时机已到处.SoundPool甚至可以在此设备上提供更好的性能.
我真的很沮丧,不知道该怎么做才能完成我的应用程序,所以如果有人能帮助我,我真的很感激.我在下面放了一些我的音频播放器的代码示例.我已经尝试了我能想到的所有内容,包括更改缓冲区大小,使用AudioTrack.MODE_STATIC等等.新的Google设备具有低延迟音频,所以我的旧机器人的一切工作方式都很奇怪!
提前致谢
/**
* Play note
*/
public void playNote(String note, float vol)
{
PlayThread oldThread = threadMap.get(note);
if(oldThread != null) {
//Cancel timer
if(oldThread.timer != null) {
oldThread.timer.cancel();
oldThread.timer.purge();
oldThread.timer = null;
}
//Stop
oldThread.requestStop();
threadMap.remove(note);
}
//Play if within Polyphony
if(threadMap.size() < POLYPHONY) {
PlayThread thread = new PlayThread(note, vol);
thread.start();
threadMap.put(note, thread);
}
}
/**
* Stop note
*/
public void stopNote(String note, int fadeDurationInMs)
{ …Run Code Online (Sandbox Code Playgroud) 我已成功将音频文件(3gp)上传到Google-Drive.
现在我希望能够在应用程序中播放该文件.
Google Drive API仅允许获取存储在其中的文件的输入流.
在我的情况下,输入的所有MediaPlayer功能都不可用,只有InputSteam:
我知道我可以将文件从Google-Drive保存到缓存并播放,但我想避免存储处理,并动态播放文件.
我试图搜索这个问题,并且发现可能使用AudioTrack(这里).它也可能使用新的Jelly-Bean功能(在这里显示,从这里找到),但我不确定它是否相当低级别.
可悲的是,使用AudioTrack我听错了声音(噪音).
我还注意到MediaPlayer可以选择将dataSource设置为MediaDataSource(这里),但不仅我不确定如何使用它,它还需要API 23及更高版本.
当然,我尝试使用Google-Drive中提供的网址,但这仅用于其他目的,并未定向到音频文件,因此无法使用MediaPlayer.
给定一个InputStream,是否可以使用AudioTrack或其他东西来播放音频3gp文件?
可能有支持库解决方案吗?
之前,我问过使用FFT和Complex类获取频率wav音频的问题,
在那里,我需要从AudioRecord输入计算FFT值 - >从麦克风,我以某种方式设法获得FFT值...
现在我需要从之前保存的*.wav音频文件中计算FFT值,我将音频保存在我项目'res'文件夹内'raw'文件夹中
我仍然使用相同的FFT类:http://www.cs.princeton.edu/introcs/97data/FFT.java
与它一起使用的复杂类:http://introcs.cs.princeton.edu/java/97data/Complex.java.html
我使用这种方法从我的原始文件中读取音频文件,然后我调用方法calculateFFT来使用它
private static final int RECORDER_BPP = 16;
private static final int RECORDER_SAMPLERATE = 44100;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO;
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private void asli(){
int counter = 0;
int data;
InputStream inputStream = getResources().openRawResource(R.raw.b1);
DataInputStream dataInputStream = new DataInputStream(inputStream);
List<Integer> content = new ArrayList<Integer>();
try {
while ((data = dataInputStream.read()) != -1) {
content.add(data);
counter++; }
} …Run Code Online (Sandbox Code Playgroud) audiotrack ×10
android ×9
audio ×2
java ×2
opensl ×2
android-ndk ×1
audiorecord ×1
codec ×1
ffmpeg ×1
fft ×1
inputstream ×1
marker ×1
pcm ×1
playback ×1
soundpool ×1