dart_vlc
dart_vlc copied to clipboard
[feature-request] subtitle selection, loading, event-streams & other configuration
Describe the bug I encountered the following error: since the setAudioTrack method did not work, I tried to set the audio track using commandlineArguments. But this didn't work either: commandlineArguments: ['--audio-track=1'] The default audio track will still be played during playback (which corresponds to audio-track=0, right). videoPlayer.setAudioTrack(1); didn't work either. Does this feature not work at all in the current version?
I tried it and the following command worked perfectly on the same video file: vlc.exe videopath.mkv --audio-track=1
I have attached sample code.
Minimal reproducible code
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:dart_vlc/dart_vlc.dart';
Future<void> main() async {
await DartVLC.initialize(useFlutterNativeView: true);
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'App',
theme: ThemeData( primarySwatch: Colors.teal, ),
home: const MyHomePage(title: 'App'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final videoPlayer = Player(
id: 0,
registerTexture: false,
commandlineArguments: ['--audio-track=1']
);
@override
void initState() {
videoPlayer.open(
Media.file(File('-- video path that contains more than 1 audio track --')),
autoStart: true
);
super.initState();
}
@override
void dispose() {
videoPlayer.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return NativeVideo(
player: videoPlayer,
height: double.infinity,
width: double.infinity,
fit: BoxFit.cover,
showControls: false,
);
}
}
Operating system:
- Platform: Windows
- OS version: Windows 11 21H2
Could you please copy & replace DLLs & plugins
folder from local VLC installation to your .exe
folder?
Let me know if it fixes it.
Unfortunately it didn't work.
Version 3.0.16 is installed, but I also tried it with version 3.0.9.2 and in both cases the following command worked when run from powershell: vlc.exe videopath.mkv --audio-track=1
I did the build for Windows with the following command: flutter build windows
I use Android Studio to test/develop.
The following warnings now appeared during the Windows build: J:\AndroidStudioProjects\DartVLCDemowindows\flutter\ephemeral.plugin_symlinks\dart_vlc\core\api\api.cc(471,59): warning C4267: '=': conversion from 'size_t' to 'int32_t', possible loss of data [J:\AndroidStudioProjects\DartVLCDemowindows\build\windows\dart_vlc_core\dart_vlc_core.vcxproj] J:\AndroidStudioProjects\DartVLCDemowindows\flutter\ephemeral.plugin_symlinks\dart_vlc\core\api\api.cc(492,51): warning C4267: '=': conversion from 'size_t' to 'int32_t', possible loss of data [J:\AndroidStudioProjects\DartVLCDemowindows\build\windows\dart_vlc_core\dart_vlc_core.vcxproj] J:\AndroidStudioProjects\DartVLCDemowindows\flutter\ephemeral.plugin_symlinks\dart_vlc\core\api\api.cc(503,57): warning C4267: 'argument': conversion from 'size_t' to 'int32_t', possible loss of data [J:\AndroidStudioProjects\DartVLCDemowindows\build\windows\dart_vlc_core\dart_vlc_core.vcxproj] J:\AndroidStudioProjects\DartVLCDemowindows\flutter\ephemeral.plugin_symlinks\dart_vlc\core\api\api.cc(504,46): warning C4267: 'argument': conversion from 'size_t' to 'int32_t', possible loss of data [J:\AndroidStudioProjects\DartVLCDemowindows\build\windows\dart_vlc_core\dart_vlc_core.vcxproj] J:\AndroidStudioProjects\DartVLCDemowindows\flutter\ephemeral.plugin_symlinks\dart_vlc\core\api\api.cc(504,59): warning C4267: 'argument': conversion from 'size_t' to 'int32_t', possible loss of data [J:\AndroidStudioProjects\DartVLCDemowindows\build\windows\dart_vlc_core\dart_vlc_core.vcxproj] J:\AndroidStudioProjects\DartVLCDemowindows\flutter\ephemeral.plugin_symlinks\dart_vlc\core\api\api.cc(510,72): warning C4267: 'argument': conversion from 'size_t' to 'int32_t', possible loss of data [J:\AndroidStudioProjects\DartVLCDemowindows\build\windows\dart_vlc_core\dart_vlc_core.vcxproj] J:\AndroidStudioProjects\DartVLCDemowindows\flutter\ephemeral.plugin_symlinks\dart_vlc\core\api\api.cc(511,46): warning C4267: 'argument': conversion from 'size_t' to 'int32_t', possible loss of data [J:\AndroidStudioProjects\DartVLCDemowindows\build\windows\dart_vlc_core\dart_vlc_core.vcxproj] J:\AndroidStudioProjects\DartVLCDemowindows\flutter\ephemeral.plugin_symlinks\dart_vlc\core\api\api.cc(511,59): warning C4267: 'argument': conversion from 'size_t' to 'int32_t', possible loss of data [J:\AndroidStudioProjects\DartVLCDemowindows\build\windows\dart_vlc_core\dart_vlc_core.vcxproj] J:\AndroidStudioProjects\DartVLCDemowindows\flutter\ephemeral.plugin_symlinks\dart_vlc\core\player\player.cc(313,9): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To di sable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. [J:\AndroidStudioProjects\DartVLCDemobuild\windows\dart_vlc_core\dart_vlc_core.vcxproj]
Please make sure that you're calling Player.setAudioTrack(1)
once the file has started playing or buffered.
Maybe add await Future.delayed(const Duration(seconds: 10))
or listen to event stream.
Other:
I'm not super certain but is audio-track
a media option? as opposed to command line argument?
Locally, you should try to add this for testing & see if that works:
vlc_media.addOption(":audio-track=1");
here:
https://github.com/alexmercerind/dart_vlc/blob/d0bfe743d83f5591fcad82b2f6519262dc2c216a/core/player/player.cc#L76
Half success!
The command given in the player.cc file (vlc_media.addOption(":audio-track=1");) worked! Unfortunately, the others did not work, even though I tried the following solutions together and separately. Maybe I messed something up somewhere?
0.:
void initState() {
...
setAudioTrack();
...
}
void setAudioTrack() async {
await Future.delayed(const Duration(seconds: 10));
videoPlayer.setAudioTrack(1);
}
1.:
videoPlayer.playbackStream.listen((PlaybackState state) {
if (state.isPlaying) {
videoPlayer.setAudioTrack(1);
}
});
2.:
videoPlayer.bufferingProgressStream.listen((double event) {
setState(() {
if (event == 100) {
videoPlayer.setAudioTrack(1);
}
});
},
);
Exposing audioTrack
in Media
constructor will need time & effort. Maybe refactoring whole API to create VLC::Media
objects in advance, to easily deal with other options present in libvlc.
I apologize to you, I think I figured out why it didn't work. According to the VLC CLI help, the audio-track argument is calculated from 0, and accordingly I set the audio-track value to 1, i.e. the 2nd audio track. However, out of curiosity, I changed it to 2 and it already worked. So we no longer count from 0 through the plugin? However, it was instructive for me that you can only change audio tracks after buffering. Thanks!
I have another question, is it not possible to set the subtitles in the same way as the audio track? I mean things like:
videoPlayer.setSubtitleTrack(2);
videoPlayer.subtitleTrackCount;
Or should I write this as a separate request? :)
We have #9. One of the oldest issues. I haven't been working actively on this project for many days. Keeping this open as-well.
I still get this error
The following warnings now appeared during the Windows build:
J:\AndroidStudioProjects\DartVLCDemowindows\flutter\ephemeral.plugin_symlinks\dart_vlc\core\api\api.cc(471,59): warning C4267: '=': conversion from 'size_t' to 'int32_t', possible loss of data
[J:\AndroidStudioProjects\DartVLCDemowindows\build\windows\dart_vlc_core\dart_vlc_core.vcxproj]
J:\AndroidStudioProjects\DartVLCDemowindows\flutter\ephemeral.plugin_symlinks\dart_vlc\core\api\api.cc(492,51): warning C4267: '=': conversion from 'size_t' to 'int32_t', possible loss of data
[J:\AndroidStudioProjects\DartVLCDemowindows\build\windows\dart_vlc_core\dart_vlc_core.vcxproj]
J:\AndroidStudioProjects\DartVLCDemowindows\flutter\ephemeral.plugin_symlinks\dart_vlc\core\api\api.cc(503,57): warning C4267: 'argument': conversion from 'size_t' to 'int32_t', possible loss of data
[J:\AndroidStudioProjects\DartVLCDemowindows\build\windows\dart_vlc_core\dart_vlc_core.vcxproj]
J:\AndroidStudioProjects\DartVLCDemowindows\flutter\ephemeral.plugin_symlinks\dart_vlc\core\api\api.cc(504,46): warning C4267: 'argument': conversion from 'size_t' to 'int32_t', possible loss of data
[J:\AndroidStudioProjects\DartVLCDemowindows\build\windows\dart_vlc_core\dart_vlc_core.vcxproj]
J:\AndroidStudioProjects\DartVLCDemowindows\flutter\ephemeral.plugin_symlinks\dart_vlc\core\api\api.cc(504,59): warning C4267: 'argument': conversion from 'size_t' to 'int32_t', possible loss of data
[J:\AndroidStudioProjects\DartVLCDemowindows\build\windows\dart_vlc_core\dart_vlc_core.vcxproj]
J:\AndroidStudioProjects\DartVLCDemowindows\flutter\ephemeral.plugin_symlinks\dart_vlc\core\api\api.cc(510,72): warning C4267: 'argument': conversion from 'size_t' to 'int32_t', possible loss of data
[J:\AndroidStudioProjects\DartVLCDemowindows\build\windows\dart_vlc_core\dart_vlc_core.vcxproj]
J:\AndroidStudioProjects\DartVLCDemowindows\flutter\ephemeral.plugin_symlinks\dart_vlc\core\api\api.cc(511,46): warning C4267: 'argument': conversion from 'size_t' to 'int32_t', possible loss of data
[J:\AndroidStudioProjects\DartVLCDemowindows\build\windows\dart_vlc_core\dart_vlc_core.vcxproj]
J:\AndroidStudioProjects\DartVLCDemowindows\flutter\ephemeral.plugin_symlinks\dart_vlc\core\api\api.cc(511,59): warning C4267: 'argument': conversion from 'size_t' to 'int32_t', possible loss of data
[J:\AndroidStudioProjects\DartVLCDemowindows\build\windows\dart_vlc_core\dart_vlc_core.vcxproj]
J:\AndroidStudioProjects\DartVLCDemowindows\flutter\ephemeral.plugin_symlinks\dart_vlc\core\player\player.cc(313,9): warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To di
sable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. [J:\AndroidStudioProjects\DartVLCDemobuild\windows\dart_vlc_core\dart_vlc_core.vcxproj]
it appear during the flutter windows build, any solution?