8

オーディオ トラックを使用して、ストリーム モードで別のサウンドを再生しています。各サウンドの再生中/再生終了を知る方法があるかどうかを知りたいです。

次のようにオーディオ トラックを作成します。

AudioTrack tmpAudioTrack = new AudioTrack(
        STREAM_TYPE, 
        SAMPLE_RATE, 
        CHANNEL_CONFIG_TYPE, 
            AUDIO_FORMAT_TYPE, 
        getOptimalBufferSize(), 
        AUDIO_TRACK_MODE);'

そして、バックグラウンド スレッドで開始します。

backround_thread = new Thread(new MyRunnable(aTrack));
    backround_thread.start();   

ランナブル内に次のように各サウンドを記述します。

byte generatedSnd[] = new byte[2 * beepSamples];
<code for filling the buffer with sound here>
int bytesWritten = track.write(generatedSnd, 0, generatedSnd.length);

setNotificationMarkerPosition、setLoopPoints、setPositionNotificationPeriod などの AudioTrack API を使用してこれを達成できますか? そしてそれらはどのように機能しますか?

各サウンドは、異なる持続時間になる場合があります。これが鍵だと思います。

これらの API のドキュメントを完全には理解していません。各フレームはサンプルと同じですか? 各サウンドの開始/終了位置にマーカーを指定するにはどうすればよいですか?

ありがとう、

4

1 に答える 1

18

これは私が見つけたものです:

私にとって、フレームはサンプルです。つまり、サウンドの持続時間にサンプルレートを掛けたものです。

AudioTrack.setPositionNotificationPeriodを使用するには、一定量のサンプルを渡します。つまり、200サンプルを渡すと、コールバックは200サンプルごとに呼び出されます。

tmpAudioTrack.setPositionNotificationPeriod(duration * sampleRate);

.setNotificationMarkerPositionを使用するには、一定量のサンプルも渡します。ただし、これは絶対的なものであり、期間APIのように相対的なものではありません。したがって、サウンドがいつ終了するかを判断する場合は、サンプル量(サウンドトラックの合計継続時間* sampleRate)を渡します。

tmpAudioTrack.setNotificationMarkerPosition(duration * sampleRate);

ただし、サウンドトラックの途中ですでに再生していて、マーカーを追加してコールバックされるようにしたい場合は、たとえば3秒後に、オーディオトラックの現在の再生ヘッドを追加する必要があります。これ:(あなたの持続時間は3秒です)

tmpAudioTrack.setNotificationMarkerPosition(tmpAudioTrack.getPlaybackHeadPosition() + (duration * sampleRate));

そして、これはあなたが期間とマーカー通知に登録される方法です:

tmpAudioTrack.setPlaybackPositionUpdateListener(new OnPlaybackPositionUpdateListener(){

    @Override
    public void onMarkerReached(AudioTrack arg0) {

    }

    @Override
    public void onPeriodicNotification(AudioTrack arg0) {

    }

});
于 2012-09-11T23:29:06.877 に答える