标签: audiotrack

什么原因在Android中使用OpenSL ES而不是AudioTrack?

目前我正在使用AudioTrack传递来自本机层的音频数据来播放.

我似乎可以在本机层使用OpenSL ES而不是Java中的AudioTrack.与AudioTrack相比,OpenSL ES提供了哪些优势?

android android-ndk opensl audiotrack

9
推荐指数
1
解决办法
3万
查看次数

Android:使用ffmpeg播放带有AudioTrack的MP3文件

我在我的项目中集成了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文件.我搜索了很多,但没有找到任何正确的答案.

android ffmpeg audiotrack

9
推荐指数
1
解决办法
5974
查看次数

发出编码和解码音频录制到G711(PCMU - uLaw)格式

当我们需要流音频时,没有太多关于应用此编解码器的信息.如果不应用编解码器,我的代码就像在两个设备之间建立通信的魅力一样,但我需要以该格式进行编码/解码,因为我需要与服务器进行流式处理而不是两个设备之间的流式传输(我使用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)

android codec pcm audiorecord audiotrack

9
推荐指数
1
解决办法
5107
查看次数

Android AudioTrack不播放所有样本

我正在使用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)

android audiotrack

9
推荐指数
1
解决办法
741
查看次数

AudioTrack - 如何知道声音何时开始/结束?

我正在使用音频轨道以流模式播放不同的声音.我想知道是否有办法知道每个声音的生命/结束时间.

我像这样创建音轨:

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的文档.每个框架是否与样本相同?如何为每个声音的开始/结束位置指定标记?

谢谢,

android marker audiotrack

8
推荐指数
1
解决办法
7172
查看次数

将AudioTrack与AudioManager setSpeakerphoneOn配合使用

我正在使用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)

但是对于这条线,问题是当我接到一个电话(正常通话)时,默认情况下扬声器开启.我真的需要帮助.

android audiotrack android-audiomanager

8
推荐指数
1
解决办法
9715
查看次数

使用Android上的OpenSL ES通过套接字通信流式传输MP3音频

我正试图通过接入点使用WiFi将MP3从Android手机流式传输到另一部Android手机.问题是OpenSL ES似乎只支持PCM音频缓冲区作为源(除非使用URI).而不是在发送之前解码"主"侧的潜在巨大文件我宁愿让"客户端"将MP3解码为PCM.请记住,这必须作为文件流发生,而不是简单地发送整个文件然后解码.有没有办法使用OpenSL ES来实现这一目标?AudioTrack?这似乎是一个相当普遍的要求.

android audio-streaming opensl audiotrack

8
推荐指数
1
解决办法
2444
查看次数

Android音频编程噩梦 - soundpool,audiotrack arrghh?

我已经构建了一个简单的音乐音序器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)

java audio android soundpool audiotrack

8
推荐指数
2
解决办法
7744
查看次数

如何播放不在网址或存储空间内的音频文件的InputStream?

背景

我已成功将音频文件(3gp)上传到Google-Drive.

现在我希望能够在应用程序中播放该文件.

Google Drive API仅允许获取存储在其中的文件的输入流.

问题

在我的情况下,输入的所有MediaPlayer功能都不可用,只有InputSteam:

http://developer.android.com/reference/android/media/MediaPlayer.html#setDataSource(java.io.FileDescriptor)

我知道我可以将文件从Google-Drive保存到缓存并播放,但我想避免存储处理,并动态播放文件.

我试过的

我试图搜索这个问题,并且发现可能使用AudioTrack(这里).它也可能使用新的Jelly-Bean功能(在这里显示,从这里找到),但我不确定它是否相当低级别.

可悲的是,使用AudioTrack我听错了声音(噪音).

我还注意到MediaPlayer可以选择将dataSource设置为MediaDataSource(这里),但不仅我不确定如何使用它,它还需要API 23及更高版本.

当然,我尝试使用Google-Drive中提供的网址,但这仅用于其他目的,并未定向到音频文件,因此无法使用MediaPlayer.

这个问题

给定一个InputStream,是否可以使用AudioTrack或其他东西来播放音频3gp文件?

可能有支持库解决方案吗?

android inputstream playback android-mediaplayer audiotrack

8
推荐指数
1
解决办法
2545
查看次数

从音频文件计算FFT

之前,我问过使用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)

java audio fft audiotrack

7
推荐指数
1
解决办法
2万
查看次数