Skip to content

Commit fb58107

Browse files
author
Nay Linn
committed
Fixed audio track and subtitle track issues in Android
1 parent 11cead5 commit fb58107

File tree

22 files changed

+4233
-3498
lines changed

22 files changed

+4233
-3498
lines changed

flutter_vlc_player/android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ android {
6262

6363
testLogging {
6464
events "passed", "skipped", "failed", "standardOut", "standardError"
65-
outputs.upToDateWhen { false }
65+
outputs.upToDateWhen {false}
6666
showStandardStreams = true
6767
}
6868
}
Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,20 @@
11
package software.solid.fluttervlcplayer.Enums;
22

33
public enum DataSourceType {
4-
ASSET,
5-
NETWORK,
6-
FILE
4+
5+
ASSET(0),
6+
NETWORK(1),
7+
FILE(2);
8+
9+
private int mType;
10+
11+
DataSourceType (int type)
12+
{
13+
this.mType = type;
14+
}
15+
16+
public int getNumericType() {
17+
return mType;
18+
}
19+
720
}
Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,20 @@
11
package software.solid.fluttervlcplayer.Enums;
22

33
public enum HwAcc {
4-
AUTOMATIC,
5-
DISABLED,
6-
DECODING,
7-
FULL
4+
5+
AUTOMATIC(-1),
6+
DISABLED(0),
7+
DECODING(1),
8+
FULL(2);
9+
10+
private int mType;
11+
12+
HwAcc (int type)
13+
{
14+
this.mType = type;
15+
}
16+
17+
public int getNumericType() {
18+
return mType;
19+
}
820
}

flutter_vlc_player/android/src/main/java/software/solid/fluttervlcplayer/FlutterVlcPlayer.java

Lines changed: 119 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
import org.videolan.libvlc.MediaPlayer;
1515
import org.videolan.libvlc.RendererDiscoverer;
1616
import org.videolan.libvlc.RendererItem;
17+
import org.videolan.libvlc.interfaces.IMedia;
18+
import java.util.Random;
19+
import android.util.Log;
1720

1821
import java.io.ByteArrayOutputStream;
1922
import java.io.IOException;
@@ -166,7 +169,10 @@ public void onEvent(MediaPlayer.Event event) {
166169
eventObject.put("width", width);
167170
eventObject.put("speed", mediaPlayer.getRate());
168171
eventObject.put("duration", mediaPlayer.getLength());
169-
// Track methods removed for VLC 4.0 compatibility
172+
eventObject.put("audioTracksCount", getAudioTracksCount());
173+
eventObject.put("activeAudioTrack", getAudioTrack());
174+
eventObject.put("spuTracksCount", getSpuTracksCount());
175+
eventObject.put("activeSpuTrack", getSpuTrack());
170176
mediaEventSink.success(eventObject.clone());
171177
break;
172178

@@ -188,7 +194,10 @@ public void onEvent(MediaPlayer.Event event) {
188194
eventObject.put("position", mediaPlayer.getTime());
189195
eventObject.put("duration", mediaPlayer.getLength());
190196
eventObject.put("buffer", event.getBuffering());
191-
// Track methods removed for VLC 4.0 compatibility
197+
eventObject.put("audioTracksCount", getAudioTracksCount());
198+
eventObject.put("activeAudioTrack", getAudioTrack());
199+
eventObject.put("spuTracksCount", getSpuTracksCount());
200+
eventObject.put("activeSpuTrack", getSpuTrack());
192201
eventObject.put("isPlaying", mediaPlayer.isPlaying());
193202
mediaEventSink.success(eventObject);
194203
break;
@@ -343,94 +352,181 @@ long getDuration() {
343352
return mediaPlayer.getLength();
344353
}
345354

346-
// Track methods commented out for VLC 4.0 compatibility
347-
// These will need to be reimplemented using the new VLC 4.0 API
348-
349355
int getSpuTracksCount() {
350356
if (mediaPlayer == null) return -1;
351-
return 0; // Placeholder - needs VLC 4.0 implementation
357+
358+
IMedia.Track[] spuTracks = mediaPlayer.getTracks(IMedia.Track.Type.Text);
359+
return spuTracks != null ? spuTracks.length : 0;
352360
}
353361

354362
HashMap<Integer, String> getSpuTracks() {
355-
return new HashMap<Integer, String>(); // Placeholder
363+
if (mediaPlayer == null) return new HashMap<Integer, String>();
364+
365+
IMedia.Track[] spuTracks = mediaPlayer.getTracks(IMedia.Track.Type.Text);
366+
HashMap<Integer, String> subtitles = new HashMap<>();
367+
if (spuTracks != null)
368+
for (IMedia.Track trackDescription : spuTracks) {
369+
subtitles.put(Integer.parseInt(trackDescription.id.replaceAll("\\D", "")), trackDescription.name);
370+
}
371+
return subtitles;
356372
}
357373

358374
void setSpuTrack(int index) {
359375
if (mediaPlayer == null) return;
360-
// VLC 4.0 implementation needed
376+
377+
try {
378+
379+
if ( index >= 0) {
380+
// Select the track by its ID
381+
mediaPlayer.selectTrack("spu/"+index);
382+
} else if (index == -1) {
383+
// Unselect all text tracks
384+
mediaPlayer.unselectTrackType(IMedia.Track.Type.Text);
385+
}
386+
} catch (Exception e) {
387+
Log.e(TAG, "setAudioTrack failed: " + e.getMessage());
388+
}
361389
}
362390

363391
int getSpuTrack() {
364392
if (mediaPlayer == null) return -1;
365-
return -1; // Placeholder
393+
394+
IMedia.Track track = mediaPlayer.getSelectedTrack(IMedia.Track.Type.Text);
395+
if(track == null) {
396+
return -1;
397+
}
398+
return Integer.parseInt(track.id.replaceAll("\\D", ""));
366399
}
367400

368401
void setSpuDelay(long delay) {
369402
if (mediaPlayer == null) return;
370-
// VLC 4.0 implementation needed
403+
404+
mediaPlayer.setSpuDelay(delay);
371405
}
372406

373407
long getSpuDelay() {
374408
if (mediaPlayer == null) return -1;
375-
return -1; // Placeholder
409+
410+
return mediaPlayer.getSpuDelay();
376411
}
377412

378413
void addSubtitleTrack(String url, boolean isSelected) {
379414
if (mediaPlayer == null) return;
380-
// VLC 4.0 implementation needed
415+
416+
mediaPlayer.addSlave(Media.Slave.Type.Subtitle, Uri.parse(url), isSelected);
381417
}
382418

383419
int getAudioTracksCount() {
384420
if (mediaPlayer == null) return -1;
385-
return 0; // Placeholder
421+
422+
IMedia.Track[] audioTracks = mediaPlayer.getTracks(IMedia.Track.Type.Audio);
423+
return audioTracks != null ? audioTracks.length : 0;
386424
}
387425

388426
HashMap<Integer, String> getAudioTracks() {
389-
return new HashMap<Integer, String>(); // Placeholder
427+
if (mediaPlayer == null) return new HashMap<Integer, String>();
428+
429+
IMedia.Track[] audioTracks = mediaPlayer.getTracks(IMedia.Track.Type.Audio);
430+
HashMap<Integer, String> audios = new HashMap<>();
431+
Random random = new Random();
432+
if (audioTracks != null)
433+
for (IMedia.Track trackDescription : audioTracks) {
434+
audios.put(Integer.parseInt(trackDescription.id.replaceAll("\\D", "")), trackDescription.name);
435+
}
436+
return audios;
390437
}
391438

392439
void setAudioTrack(int index) {
393440
if (mediaPlayer == null) return;
394-
// VLC 4.0 implementation needed
441+
442+
try {
443+
444+
if ( index >= 0) {
445+
// Select the track by its ID
446+
mediaPlayer.selectTrack("audio/"+index);
447+
} else if (index == -1) {
448+
// Unselect all audio tracks
449+
mediaPlayer.unselectTrackType(IMedia.Track.Type.Audio);
450+
}
451+
} catch (Exception e) {
452+
Log.e(TAG, "setAudioTrack failed: " + e.getMessage());
453+
}
395454
}
396455

397456
int getAudioTrack() {
398457
if (mediaPlayer == null) return -1;
399-
return -1; // Placeholder
458+
459+
IMedia.Track track = mediaPlayer.getSelectedTrack(IMedia.Track.Type.Audio);
460+
if(track == null) {
461+
return -1;
462+
}
463+
return Integer.parseInt(track.id.replaceAll("\\D", ""));
400464
}
401465

402466
void setAudioDelay(long delay) {
403467
if (mediaPlayer == null) return;
404-
// VLC 4.0 implementation needed
468+
469+
mediaPlayer.setAudioDelay(delay);
405470
}
406471

407472
long getAudioDelay() {
408473
if (mediaPlayer == null) return -1;
409-
return -1; // Placeholder
474+
475+
return mediaPlayer.getAudioDelay();
410476
}
411477

412478
void addAudioTrack(String url, boolean isSelected) {
413479
if (mediaPlayer == null) return;
414-
// VLC 4.0 implementation needed
480+
481+
mediaPlayer.addSlave(Media.Slave.Type.Audio, Uri.parse(url), isSelected);
415482
}
416483

417484
int getVideoTracksCount() {
418485
if (mediaPlayer == null) return -1;
419-
return 0; // Placeholder
486+
487+
IMedia.Track[] videoTracks = mediaPlayer.getTracks(IMedia.Track.Type.Video);
488+
return videoTracks != null ? videoTracks.length : 0;
489+
420490
}
421491

422492
HashMap<Integer, String> getVideoTracks() {
423-
return new HashMap<Integer, String>(); // Placeholder
493+
if (mediaPlayer == null) return new HashMap<Integer, String>();
494+
495+
IMedia.Track[] videoTracks = mediaPlayer.getTracks(IMedia.Track.Type.Video);
496+
HashMap<Integer, String> videos = new HashMap<>();
497+
if (videoTracks != null)
498+
for (IMedia.Track trackDescription : videoTracks) {
499+
videos.put(Integer.parseInt(trackDescription.id.replaceAll("\\D", "")), trackDescription.name);
500+
}
501+
return videos;
424502
}
425503

426504
void setVideoTrack(int index) {
427505
if (mediaPlayer == null) return;
428-
// VLC 4.0 implementation needed
506+
507+
try {
508+
509+
if ( index >= 0) {
510+
// Select the track by its ID
511+
mediaPlayer.selectTrack("video/"+index);
512+
} else if (index == -1) {
513+
// Unselect all video tracks
514+
mediaPlayer.unselectTrackType(IMedia.Track.Type.Video);
515+
}
516+
} catch (Exception e) {
517+
Log.e(TAG, "setAudioTrack failed: " + e.getMessage());
518+
}
429519
}
430520

431521
int getVideoTrack() {
432522
if (mediaPlayer == null) return -1;
433-
return -1; // Placeholder
523+
524+
IMedia.Track track = mediaPlayer.getSelectedTrack(IMedia.Track.Type.Video);
525+
if(track == null) {
526+
return -1;
527+
}
528+
return Integer.parseInt(track.id.replaceAll("\\D", ""));
529+
434530
}
435531

436532
void setVideoScale(float scale) {
@@ -567,7 +663,6 @@ void castToRenderer(String rendererDevice) {
567663
String getSnapshot() {
568664
if (textureView == null) return null;
569665
if (!mediaPlayer.isPlaying()) return null;
570-
571666
Bitmap bitmap = textureView.getBitmap();
572667
if (bitmap == null) return null;
573668

0 commit comments

Comments
 (0)