Android AudioTrack 在声音开始和结束时点击

Posted

技术标签:

【中文标题】Android AudioTrack 在声音开始和结束时点击【英文标题】:Android AudioTrack clicks at start and end of sound 【发布时间】:2011-11-20 18:29:19 【问题描述】:

我在播放声音(来自 SD 卡的 wav)的开始和结束时都会收到点击。它必须与轨道缓冲有关,但我不知道解决方案。另外,每次播放声音时我都会创建一个新的,这样可以吗还是有更好的方法?有许多声音一遍又一遍地播放。代码如下:

public void PlayAudioTrack(final String filePath, final Float f) throws IOException
    

    new Thread(new Runnable()  public void run()  
            //play sound here
        int minSize = AudioTrack.getMinBufferSize( 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT );        
           AudioTrack track = new AudioTrack( AudioManager.STREAM_MUSIC, 44100, 
             AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT, 
             minSize, AudioTrack.MODE_STREAM);

        track.setPlaybackRate((int) (44100*f));

    if (filePath==null)
    return;

    int count = 512 * 1024; 
    //Read the file..
    byte[] byteData = null;
    File file = null;
    file = new File(filePath);

    byteData = new byte[(int)count];
    FileInputStream in = null;
    try 
    in = new FileInputStream( file );

     catch (FileNotFoundException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();
    

    int bytesread = 0, ret = 0;
    int size = (int) file.length();

    while (bytesread < size)  
    try 
        ret = in.read( byteData,0, count);
     catch (IOException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
     
    track.play(); 
    if (ret != -1)  
    // Write the byte array to the track 
    track.write(byteData,0, ret); bytesread += ret; 
     
    else break;  

    try 
        in.close();
     catch (IOException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
     track.stop(); track.release(); 
    

        ).start();
        

非常感谢您的帮助

【问题讨论】:

我的音频体验不在 android 上,但您在向其写入任何字节之前调用 track.play() 似乎很奇怪。你不应该先写字节吗? 不,您需要使用 play() 打开音轨,然后写入它,因为它的 mode_streaming。我认为它可能没有正确读取 wav 标题或其他内容。 wtf 你认为你在做 ChrisWue 吗?编辑随机帖子以获得徽章对任何人都没有帮助,是吗?您至少可以尝试回答... 【参考方案1】:

难道你也可以播放 PCM 波形文件头吗?

每个 PCM 波形文件在文件的开头都有一个小标题,如果你播放它,你会播放标题字节,这可能会导致在开始时点击。

【讨论】:

确实,这 44 个字节的 WAVE-header 在播放时听起来像是点击。解决方法是在 AT 开始播放此类文件时跳过 44 个字节。【参考方案2】:

我使用 AudioTrack 在每首曲目的开头都有这些相同的点击。我通过关闭轨道音量,等待半秒钟,然后恢复正常音量来解决它。我不再有任何点击。这是代码的相关部分。

    at.play();
    at.setStereoVolume (0.0f, 0.0f);

    new Thread (new Runnable()
        public void run() 
            try
                Thread.sleep(500);
             catch (InterruptedException ie)  ; 
            at.setStereoVolume (1.0f, 1.0f);
        
    ).start();

    new Thread (new Runnable()
        public void run() 
            int i = 0;
            try
                buffer = new byte[512];
                while(((i = is.read(buffer)) != -1) && !paused)
                    at.write(buffer, 0, i);
                    position += i;
                
             catch (IOException e) 
                e.printStackTrace();
            
            if (!paused)
                parent.trackEnded();
            
        
    ).start();

【讨论】:

以上是关于Android AudioTrack 在声音开始和结束时点击的主要内容,如果未能解决你的问题,请参考以下文章

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

MediaPlayer 和 AudioTrack 不输出相同的声音

使用 Android 的 AudioTrack 来组合声音样本的字节会产生噪音

Android 音视频深入 十一 FFmpeg和AudioTrack播放声音(附源码下载)

录制音频,然后使用 AudioRecord、AudioTrack.trouble 播放

AudioTrack创建过程分析(android_audio)