-
Notifications
You must be signed in to change notification settings - Fork 168
/
Copy pathAudioTrackTranscoder.java
82 lines (71 loc) · 3.5 KB
/
AudioTrackTranscoder.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package com.otaliastudios.transcoder.transcode;
import android.media.MediaCodec;
import android.media.MediaExtractor;
import android.media.MediaFormat;
import androidx.annotation.NonNull;
import com.otaliastudios.transcoder.engine.TrackType;
import com.otaliastudios.transcoder.internal.MediaCodecBuffers;
import com.otaliastudios.transcoder.postprocessor.AudioPostProcessor;
import com.otaliastudios.transcoder.resample.AudioResampler;
import com.otaliastudios.transcoder.sink.DataSink;
import com.otaliastudios.transcoder.source.DataSource;
import com.otaliastudios.transcoder.stretch.AudioStretcher;
import com.otaliastudios.transcoder.time.PresentationTime;
import com.otaliastudios.transcoder.time.TimeInterpolator;
import com.otaliastudios.transcoder.transcode.internal.AudioEngine;
import java.nio.ByteBuffer;
public class AudioTrackTranscoder extends BaseTrackTranscoder {
private TimeInterpolator mTimeInterpolator;
private PresentationTime mPresentationTime;
private AudioStretcher mAudioStretcher;
private AudioResampler mAudioResampler;
private AudioPostProcessor mAudioPostProcessor;
private AudioEngine mAudioEngine;
private MediaCodec mEncoder; // to create the channel
private MediaFormat mEncoderOutputFormat; // to create the channel
public AudioTrackTranscoder(@NonNull DataSource dataSource,
@NonNull DataSink dataSink,
@NonNull TimeInterpolator timeInterpolator,
@NonNull AudioStretcher audioStretcher,
@NonNull AudioResampler audioResampler,
@NonNull AudioPostProcessor audioPostProcessor,
@NonNull PresentationTime presentationTime) {
super(dataSource, dataSink, TrackType.AUDIO);
mTimeInterpolator = timeInterpolator;
mAudioStretcher = audioStretcher;
mAudioResampler = audioResampler;
mAudioPostProcessor = audioPostProcessor;
mPresentationTime = presentationTime;
}
@Override
protected void onCodecsStarted(@NonNull MediaFormat inputFormat, @NonNull MediaFormat outputFormat, @NonNull MediaCodec decoder, @NonNull MediaCodec encoder) {
super.onCodecsStarted(inputFormat, outputFormat, decoder, encoder);
mEncoder = encoder;
mEncoderOutputFormat = outputFormat;
}
@Override
protected boolean onFeedEncoder(@NonNull MediaCodec encoder, @NonNull MediaCodecBuffers encoderBuffers, long timeoutUs) {
if (mAudioEngine == null) return false;
return mAudioEngine.feedEncoder(encoderBuffers, timeoutUs);
}
@Override
protected void onDecoderOutputFormatChanged(@NonNull MediaCodec decoder, @NonNull MediaFormat format) {
super.onDecoderOutputFormatChanged(decoder, format);
mAudioEngine = new AudioEngine(decoder, format,
mEncoder, mEncoderOutputFormat,
mTimeInterpolator,
mAudioStretcher,
mAudioResampler,
mAudioPostProcessor,
mPresentationTime);
mEncoder = null;
mEncoderOutputFormat = null;
mTimeInterpolator = null;
mAudioStretcher = null;
mAudioResampler = null;
}
@Override
protected void onDrainDecoder(@NonNull MediaCodec decoder, int bufferIndex, @NonNull ByteBuffer bufferData, long presentationTimeUs, boolean endOfStream) {
mAudioEngine.drainDecoder(bufferIndex, bufferData, presentationTimeUs, endOfStream);
}
}