dart_vlc icon indicating copy to clipboard operation
dart_vlc copied to clipboard

[feature-request] subtitle selection, loading, event-streams & other configuration

Open zsottya opened this issue 2 years ago • 8 comments

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

zsottya avatar Jul 08 '22 09:07 zsottya

Could you please copy & replace DLLs & plugins folder from local VLC installation to your .exe folder? Let me know if it fixes it.

alexmercerind avatar Jul 08 '22 10:07 alexmercerind

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]

zsottya avatar Jul 08 '22 10:07 zsottya

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

alexmercerind avatar Jul 08 '22 12:07 alexmercerind

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);
      }
    });
  },
);

zsottya avatar Jul 08 '22 12:07 zsottya

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.

alexmercerind avatar Jul 08 '22 12:07 alexmercerind

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? :)

zsottya avatar Jul 08 '22 13:07 zsottya

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.

alexmercerind avatar Jul 08 '22 14:07 alexmercerind

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?

annd22 avatar Feb 04 '23 08:02 annd22