Android Audio- und Videoentwicklung (3) - AudioTrack gibt PCM-Audio auf zwei Arten wieder

Vorwort

Ich habe zuvor gelernt, dass AudioRecord PCM-Audio aufnimmt, und das entsprechende ist AudioTrack, um PCM-Audio abzuspielen (MediaPlayer und SoundPool haben andere Anwendungsszenarien).Es hat zwei Datenlademodi (MODE_STATIC, MODE_STREAM).

Modell

  • MODE_STATIC : In diesem Modus werden alle Daten auf einmal in einen festen Puffer gelegt und dann in AudioTrack geschrieben, und es besteht keine Notwendigkeit, das Schreiben später fortzusetzen. Dieser Modus belegt weniger Speicherplatz und eignet sich für kurze Audiosignale wie Handy-Klingeltöne und Systemansagen.

  • MODE_STREAM : Dieser Modus schreibt weiterhin Audiodaten in AudioTrack, und die Schreibaktion wird blockiert, bis der Datenstrom von der Java-Schicht zur nativen Schicht übertragen wird, was für große Dateien oder Dateien mit langer Wiedergabezeit geeignet ist.

Prozess im STATIC-Modus

1. Starten Sie einen anderen Thread, um die Audiodatei in einen festen Puffer zu schreiben.

2. Nachdem das Schreiben abgeschlossen ist, initialisieren Sie AudioTrack (die Parameter sind im vorherigen Abschnitt ausführlich beschrieben), erhalten den Puffer und spielen ihn ab.

    public void initStatic() {
    
    
        if (staticThread != null) {
    
    
            staticThread.interrupt();
        }
        staticThread = new Thread(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                FileInputStream fileInputStream = null;
                try {
    
    
                    File file = new File(filePath);
                    fileInputStream = new FileInputStream(file);
                    long size = fileInputStream.getChannel().size();

                    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(audiodata.length);
                    int byteValue = 0;
                    long startTime = System.currentTimeMillis();
                    while ((byteValue = fileInputStream.read()) != -1) {
    
    
                        byteArrayOutputStream.write(byteValue);
                    }
                    LogUtils.i("初始化完成" + (System.currentTimeMillis() - startTime));
                    audiodata = byteArrayOutputStream.toByteArray();

                    audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_OUT_MONO,
                            AudioFormat.ENCODING_PCM_16BIT, audiodata.length, AudioTrack.MODE_STATIC);
                    audioTrack.write(audiodata, 0, audiodata.length);
                    audioTrack.play();
                    LogUtils.i("Static播放");

                } catch (Exception e) {
    
    
                    e.printStackTrace();
                    LogUtils.e(e);
                } finally {
    
    
                    if (fileInputStream != null) {
    
    
                        try {
    
    
                            fileInputStream.close();
                        } catch (IOException e) {
    
    
                            e.printStackTrace();
                        }
                    }
                }
            }
        });
        staticThread.start();
    }

Prozess im STREAM-Modus

1. Initialisieren Sie AudioTrack.

2. Starten Sie einen anderen Thread und spielen Sie, während Sie die Audio-Stream-Datei schreiben.

3. Wenn die Wiedergabe endet, schließen Sie den Stream.

    public void startStream() {
    
    
        if (streamThread != null) {
    
    
            streamThread.interrupt();
        }
        if (audioTrack != null) {
    
    
            audioTrack = null;
        }
        audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_OUT_MONO,
                AudioFormat.ENCODING_PCM_16BIT, 1600, AudioTrack.MODE_STREAM);
        streamThread = new Thread(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                FileInputStream fileInputStream = null;
                File file = new File(filePath);
                try {
    
    
                    audioTrack.play();
                    fileInputStream = new FileInputStream(file);
                    int byteValue = 0;
                    while ((byteValue = fileInputStream.read(audiodata)) != -1) {
    
    
                        audioTrack.write(audiodata, 0, byteValue);
                    }
                } catch (Exception e) {
    
    
                    e.printStackTrace();
                    LogUtils.e(e);
                } finally {
    
    
                    if (audioTrack != null) {
    
    
                        audioTrack.stop();
                        audioTrack = null;
                    }
                    if (fileInputStream != null) {
    
    
                        try {
    
    
                            fileInputStream.close();
                        } catch (IOException e) {
    
    
                            e.printStackTrace();
                        }
                    }
                }
            }
        });
        streamThread.start();
    }

Epilog

Tatsächlich verwendet die unterste Schicht von MediaPlayer auch AudioTrack, aber es ist umfassender verpackt und kann mehrere Tonformate wie MP3, AAC, WAV, OGG usw. unterstützen, aber es kann keine PCM-Dateien direkt abspielen. Wir verwenden AudioTrack, das die Audiodaten für jeden Frame näher an der unteren Ebene steuert und abspielt.

Referenzen für diesen Blog:

Grauer schwimmender Bloggarten

Freunde, die Quellcode benötigen, können auch mein Gitub, Quellcode besuchen

Je suppose que tu aimes

Origine blog.csdn.net/m0_57372054/article/details/127200636
conseillé
Classement