31
31
import android .graphics .RectF ;
32
32
import android .media .AudioFormat ;
33
33
import android .media .AudioManager ;
34
+ import android .media .AudioRecord ;
34
35
import android .media .AudioTrack ;
35
36
import android .media .MediaPlayer ;
36
37
import android .os .Build ;
@@ -74,6 +75,7 @@ public class OvkMediaPlayer extends MediaPlayer {
74
75
private String dataSourceUrl ;
75
76
private ArrayList <OvkMediaTrack > tracks ;
76
77
private SurfaceHolder holder ;
78
+ private int minAudioBufferSize ;
77
79
private int minVideoBufferSize ;
78
80
private OnPreparedListener onPreparedListener ;
79
81
private OnErrorListener onErrorListener ;
@@ -90,8 +92,8 @@ public class OvkMediaPlayer extends MediaPlayer {
90
92
private native int naOpenFile (String filename );
91
93
private native Object naGenerateTrackInfo (int type );
92
94
// private native void naSetMinAudioBufferSize(int audioBufferSize);
93
- // private native void naDecodeVideoFromPacket ();
94
- // private native void naDecodeAudioFromPacket(int aBuffLength );
95
+ private native void naStartAudioDecoding ();
96
+ private native void naStartVideoDecoding ( );
95
97
private native void naPlay ();
96
98
private native void naPause ();
97
99
private native void naStop ();
@@ -219,7 +221,6 @@ public void prepare() throws IllegalStateException {
219
221
onErrorListener .onError (this , -1 );
220
222
} else {
221
223
getMediaInfo ();
222
-
223
224
}
224
225
}
225
226
@@ -237,12 +238,7 @@ public void run() {
237
238
@ Override
238
239
public void start () throws IllegalStateException {
239
240
if (tracks != null ) {
240
- new Thread (new Runnable () {
241
- @ Override
242
- public void run () {
243
- naPlay ();
244
- }
245
- }).start ();
241
+ naPlay ();
246
242
Log .d (MPLAY_TAG , "Playing..." );
247
243
OvkAudioTrack audio_track = null ;
248
244
OvkVideoTrack video_track = null ;
@@ -255,41 +251,9 @@ public void run() {
255
251
}
256
252
final OvkAudioTrack finalAudioTrack = audio_track ;
257
253
final OvkVideoTrack finalVideoTrack = video_track ;
258
- // new Thread(new Runnable() {
259
- // @Override
260
- // public void run() {
261
- // if(finalAudioTrack != null) {
262
- // int ch_config = finalAudioTrack.channels == 2 ?
263
- // AudioFormat.CHANNEL_CONFIGURATION_STEREO : AudioFormat.CHANNEL_CONFIGURATION_MONO;
264
- // Log.d(MPLAY_TAG, "Decoding audio track...");
265
- // try {
266
- // naDecodeAudioFromPacket(AudioTrack.getMinBufferSize(
267
- // (int) finalAudioTrack.sample_rate, ch_config, AudioFormat.ENCODING_PCM_16BIT
268
- // ));
269
- // } catch (OutOfMemoryError oom) {
270
- // stop();
271
- // }
272
- // } else {
273
- // Log.e(MPLAY_TAG, "Audio stream not found. Skipping...");
274
- // }
275
- // }
276
- // }).start();
277
-
278
- // new Thread(new Runnable() {
279
- // @Override
280
- // public void run() {
281
- // if(finalVideoTrack != null) {
282
- // Log.d(MPLAY_TAG, "Decoding video track...");
283
- // try {
284
- // naDecodeVideoFromPacket();
285
- // } catch (OutOfMemoryError oom) {
286
- // stop();
287
- // }
288
- // } else {
289
- // Log.e(MPLAY_TAG, "Video stream not found. Skipping...");
290
- // }
291
- // }
292
- // }).start();
254
+ naStartAudioDecoding ();
255
+
256
+ naStartVideoDecoding ();
293
257
}
294
258
}
295
259
@@ -300,6 +264,7 @@ private void renderAudio(final byte[] buffer, final int length) {
300
264
Log .e (MPLAY_TAG , "Audio buffer is empty" );
301
265
return ;
302
266
}
267
+
303
268
if (!prepared_audio_buffer ) {
304
269
for (int tracks_index = 0 ; tracks_index < tracks .size (); tracks_index ++) {
305
270
if (tracks .get (tracks_index ) instanceof OvkAudioTrack ) {
@@ -317,6 +282,11 @@ private void renderAudio(final byte[] buffer, final int length) {
317
282
ch_config ,
318
283
AudioFormat .ENCODING_PCM_16BIT , length * 2 , AudioTrack .MODE_STREAM );
319
284
285
+ minAudioBufferSize = AudioRecord .getMinBufferSize (
286
+ (int ) (track .sample_rate / 2 ),
287
+ ch_config ,
288
+ AudioFormat .ENCODING_PCM_16BIT );
289
+
320
290
audio_track .play ();
321
291
prepared_audio_buffer = true ;
322
292
}
@@ -388,11 +358,6 @@ private void renderVideo(final byte[] buffer, final int length) {
388
358
oom .printStackTrace ();
389
359
stop ();
390
360
}
391
- try {
392
- Thread .sleep ((long ) (1000 / track .frame_rate ));
393
- } catch (InterruptedException e ) {
394
- e .printStackTrace ();
395
- }
396
361
}
397
362
}
398
363
}
@@ -423,7 +388,6 @@ private int getPlaybackState() {
423
388
424
389
public void onResult (int cmdId , int resultCode ) {
425
390
if (cmdId == FFMPEG_COMMAND_OPEN_CODECS ) {
426
-
427
391
if (getMediaInfo () == null ) {
428
392
Log .e (MPLAY_TAG , String .format ("Can't open file: %s" , dataSourceUrl ));
429
393
Message msg = new Message ();
0 commit comments