在Android的播放PCM流(Play PCM stream in Android)

2019-09-29 19:47发布

我通过以太网端口获得PCM流。 到目前为止,我能捕捉到的数据包,并从他们的外卖数据pcm_payload。

如何在Android的玩这个原始的PCM数据? 该PCM数据是16位2声道,44.1kHz的速率流。

我既是新的Android应用程序和音频节目。 很抱歉,如果这是一个很小的问题。

Answer 1:

您可以使用AudioTrack播放PCM数据!

也许是这样的:

int bufsize = AudioTrack.getMinBufferSize(44100,
           AudioFormat.CHANNEL_OUT_STEREO,
           AudioFormat.ENCODING_PCM_16BIT);

AudioTrack audio = new AudioTrack(AudioManager.STREAM_MUSIC, 
                       44100, //sample rate
                       AudioFormat.CHANNEL_OUT_STEREO, //2 channel
                       AudioFormat.ENCODING_PCM_16BIT, // 16-bit
                       bufsize, 
                       AudioTrack.MODE_STREAM );
audio.play()

然后调用audio.write()来写你的PCM数据。



Answer 2:

it's my sollution. write stream to file and play it

public class AudioTrackPlayer {
private String pathAudio;
private AudioTrack audioPlayer;
private Thread mThread;
private int bytesread = 0, ret = 0;
private int size;
private FileInputStream in = null;
private byte[] byteData = null;
private int count = 512 * 1024; // 512 kb
private boolean isPlay = true;
private boolean isLooping = false;
private static Handler mHandler;

public AudioTrackPlayer() {

}

public void prepare(String pathAudio){
    this.pathAudio = pathAudio;
    mHandler = new Handler();
}

public void play(){
    stop();

    isPlay = true;
    bytesread = 0;
    ret = 0;
    if (pathAudio == null)
        return;

    audioPlayer = createAudioPlayer();
    if (audioPlayer == null) return;
    audioPlayer.play();

    mThread = new Thread(new PlayerProcess());
    mThread.start();
}

private final Runnable mLopingRunnable = new Runnable() {
    @Override
    public void run() {
        play();
    }
};

private AudioTrack createAudioPlayer(){
    int intSize = android.media.AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_STEREO,
            AudioFormat.ENCODING_PCM_16BIT);
    AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_STEREO,
            AudioFormat.ENCODING_PCM_16BIT, intSize, AudioTrack.MODE_STREAM);
    if (audioTrack == null) {
        Log.d("TCAudio", "audio track is not initialised ");
        return null;
    }

    File file = null;
    file = new File(pathAudio);

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

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    size = (int) file.length();
    return  audioTrack;
}

private class PlayerProcess implements Runnable{

    @Override
    public void run() {
        while (bytesread < size && isPlay) {
            if (Thread.currentThread().isInterrupted()) {
                break;
            }
            try {
                ret = in.read(byteData, 0, count);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (ret != -1) { // Write the byte array to the track
                audioPlayer.write(byteData,0, ret);
                bytesread += ret;
            } else break;
        }
        try {
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (audioPlayer!=null){
            if (audioPlayer.getState()!=AudioTrack.PLAYSTATE_STOPPED){
                audioPlayer.stop();
                audioPlayer.release();
                mThread = null;
            }
        }
        if (isLooping && isPlay ) mHandler.postDelayed(mLopingRunnable,100);
    }
}

public void setLooping(){
    isLooping = !isLooping;
}

public void pause(){

}

public void stop(){
    isPlay = false;
    if (mThread != null) {
        mThread.interrupt();
        mThread = null;
    }
    if (audioPlayer != null) {
        audioPlayer.stop();
        audioPlayer.release();
        audioPlayer = null;
    }
}

public void reset(){

}

}



文章来源: Play PCM stream in Android