Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Black screen orientation issues in 5.0.3 on Android, No implementation found on iOS #177

Open
lrorpilla opened this issue Feb 8, 2021 · 8 comments

Comments

@lrorpilla
Copy link

lrorpilla commented Feb 8, 2021

I managed to migrate from using video_player to using this, but I'm having issues on Android where if the orientation changes I get a black screen which I checked around was supposedly fixed in 4.0.0, I'm facing the same issue in 5.0.3 (related to #103 and #104).

The black screen issue seems to be fixed on seek, so to fix that I'm thinking about doing a function that responds to orientation to seek to the current duration. This doesn't seem to be elegant, I'm trying to maximize the size of a VlcPlayer to be as big as the screen allows with a SizedBox.expand.

EDIT: It appears this issue does indeed only happen when I use a SizedBox.expand. Is there any way to get the behavior I want without the black screen issue without this? It seems that otherwise in landscape, the video would be very small.

I'm also unable to play videos on iOS and I'm getting this issue: No implementation found for method listen on channel flutter_video_plugin/getVideoEvents_null Seems to be a widget issue on my end. I was able to play an MP4 with this, but not an MKV. Is this plugin unable to do Matroska on iOS? I was under the impression it should as VLC plays Matroska files.

Any fixes? I would really like to fully migrate my project to use this.

@alr2413
Copy link
Contributor

alr2413 commented Feb 8, 2021

can you share that part of code with us?

@lrorpilla
Copy link
Author

lrorpilla commented Feb 9, 2021

Sure, I've attached my widget code below. For context, I use a modified version of chewie for controls which I then swapped out to use VlcPlayer. Let me know if you might need more information to reproduce the issue.

class PlayerWithControls extends StatelessWidget {
  const PlayerWithControls({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final ChewieController chewieController = ChewieController.of(context);

    Widget _buildControls(
      BuildContext context,
      ChewieController chewieController,
    ) {
      return const MaterialControls();
    }

    return Stack(
      children: <Widget>[
        chewieController.placeholder ?? Container(),
        Center(
          child: SizedBox.expand(
            child: VlcPlayer(
              controller: chewieController.videoPlayerController,
              aspectRatio: chewieController.aspectRatio,
              placeholder: chewieController.placeholder,
            ),
          ),
        ),
        chewieController.overlay ?? Container(),
        if (!chewieController.isFullScreen)
          _buildControls(context, chewieController)
        else
          SafeArea(
            child: _buildControls(context, chewieController),
          ),
      ],
    );
  }
}

When I rotate, this message shows up. Sometimes when I rotate, it goes black and resolves itself quickly. Other times, it doesn't ever return to having picture.

D/SurfaceUtils(18709): set up nativeWindow 0x735f63a010 for 1440x1080, color 0x7fa30c09, rotation 0, usage 0x20002900 E/VLC (18709): [00000073564ae490/4f2a] libvlc window: request 3 not implemented E/VLC (18709): [00000073bebebb10/4f31] libvlc decoder: output: 2141391881 unknown, 1440x1080 stride 2048 1088, crop 0 0 0 0 W/System (18709): A resource failed to call release.

On iOS, even if I make the very root widget VlcPlayer, I'm unable to play Matroska videos but I can play MP4s.

@alr2413
Copy link
Contributor

alr2413 commented Feb 9, 2021

hmmmm,
if you can please share a sample project, so we can compile and test.

Also, i should mention that this package is based on platform view but video_player isn't. Thus, i guess you cannot easily migrate all features of the video_player dependent packages like chewie to vlc.
To make it more clear, in video_player the view is created by calling the initialize method while in flutter_vlc_player we need to first create the view from platform and then call the initialize method.

@lrorpilla
Copy link
Author

lrorpilla commented Feb 9, 2021

Here is my repo I'm working with, should work on a fresh clone and a flutter run.

Truth be told, all I did was convert from using VideoPlayerController to a VlcPlayerController and then changing some parameters to use VlcPlayerController's equivalent parameters, so I think I may be missing something or using the package wrong simply coming from video_player.

I do think it's a bit naive but on Android, everything seems to work -- except for that black screen orientation issue. I'm motivated to properly make the switch to this plugin as some Matroska videos don't work with video_player but I've tested to work perfectly well with this plugin.

@lrorpilla
Copy link
Author

lrorpilla commented Feb 11, 2021

Hi, I just discovered that using HwAcc.DISABLED would result to the video being discolored rather than pitch black and not showing up at all. The video returns to full color once the current frame in the video changes significantly (i.e. a scene change).

So I find this to be a workable less than inelegant solution -- a bit better than the player going black forever.

@alr2413
Copy link
Contributor

alr2413 commented Feb 11, 2021

I checked your migrated chewie code on a sample app. For me, there is lots of errors in console when i enter to and exit from fullscreen mode multiple times.

Also, i suggest you do not copy the source code of each project in your app. Just fork it and modify parts of code you want. After that you can include your modified fork in the project. it's a lot easier for someone to read, test and compare the code with the main git library. Also, if there is an update in the library, it might be easier to compare & merge the changes with your modified fork.

I'm still looking for a solution.
thanks for sharing your observations and findings.

@Emperor-Koala
Copy link

I'm not sure how much of a help it is, but I can say that the issue does not lie with the modified version of chewie. I'm attempting to use the plugin for myself, and creating my own controls similar to the example app, and I'm hitting a similar issue. Hopefully my input can help in some way.

Here's the error that pops up in my console when I try to play a video on iOS (both simulator and physical device):

======== Exception caught by services library ======================================================
The following MissingPluginException was thrown while activating platform stream on channel flutter_video_plugin/getVideoEvents_null:
MissingPluginException(No implementation found for method listen on channel flutter_video_plugin/getVideoEvents_null)

When the exception was thrown, this was the stack: 
#0      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:157:7)
<asynchronous suspension>
#1      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:332:12)
#2      EventChannel.receiveBroadcastStream.<anonymous closure> (package:flutter/src/services/platform_channel.dart:540:29)
#3      EventChannel.receiveBroadcastStream.<anonymous closure> (package:flutter/src/services/platform_channel.dart:526:64)
...
====================================================================================================

======== Exception caught by services library ======================================================
MissingPluginException(No implementation found for method listen on channel flutter_video_plugin/getRendererEvents_null)
====================================================================================================

When running this on Android simulator (I don't have a physical device to test), I get the following error on initialization:

[ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: PlatformException(NullPointerException, java.lang.NullPointerException: Attempt to invoke virtual method 'long java.lang.Long.longValue()' on a null object reference, null, null)
E/flutter ( 9276): #0      VlcPlayerApi.create (package:flutter_vlc_player_platform_interface/src/messages/messages.dart:628:7)
E/flutter ( 9276): <asynchronous suspension>
E/flutter ( 9276): #1      MethodChannelVlcPlayer.create (package:flutter_vlc_player_platform_interface/src/method_channel/method_channel_vlc_player.dart:55:23)
E/flutter ( 9276): #2      VlcPlayerController.initialize (package:flutter_vlc_player/src/vlc_player_controller.dart:147:29)
E/flutter ( 9276): #3      _VlcVideoState._initialize (package:video_player_test/vlc_player.dart:51:16)
E/flutter ( 9276): #4      _VlcVideoState.initState (package:video_player_test/vlc_player.dart:35:5)
E/flutter ( 9276): #5      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4765:58)
E/flutter ( 9276): #6      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4601:5)
E/flutter ( 9276): #7      Element.inflateWidget (package:flutter/src/widgets/framework.dart:3569:14)
E/flutter ( 9276): #8      Element.updateChild (package:flutter/src/widgets/framework.dart:3327:18)
E/flutter ( 9276): #9      SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6118:14)
E/flutter ( 9276): #10     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3569:14)
E/flutter ( 9276): #11     Element.updateChild (package:flutter/src/widgets/framework.dart:3327:18)
E/flutter ( 9276): #12     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter ( 9276): #13     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter ( 9276): #14     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4606:5)
E/flutter ( 9276): #15     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4601:5)
E/flutter ( 9276): #16     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3569:14)
E/flutter ( 9276): #17     Element.updateChild (package:flutter/src/widgets/framework.dart:3327:18)
E/flutter ( 9276): #18     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6118:14)
E/flutter ( 9276): #19     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3569:14)
E/flutter ( 9276): #20     Element.updateChild (package:flutter/src/widgets/framework.dart:3327:18)
E/flutter ( 9276): #21     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6118:14)
E/flutter ( 9276): #22     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3569:14)
E/flutter ( 9276): #23     Element.updateChild (package:flutter/src/widgets/framework.dart:3327:18)
E/flutter ( 9276): #24     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter ( 9276): #25     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter ( 9276): #26     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4606:5)
E/flutter ( 9276): #27     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4601:5)
E/flutter ( 9276): #28     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3569:14)
E/flutter ( 9276): #29     Element.updateChild (package:flutter/src/widgets/framework.dart:3327:18)
E/flutter ( 9276): #30     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter ( 9276): #31     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter ( 9276): #32     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4606:5)
E/flutter ( 9276): #33     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4601:5)
E/flutter ( 9276): #34     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3569:14)
E/flutter ( 9276): #35     Element.updateChild (package:flutter/src/widgets/framework.dart:3327:18)
E/flutter ( 9276): #36     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter ( 9276): #37     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
E/flutter ( 9276): #38     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter ( 9276): #39     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4606:5)
E/flutter ( 9276): #40     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4791:11)
E/flutter ( 9276): #41     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4601:5)
E/flutter ( 9276): #42     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3569:14)
E/flutter ( 9276): #43     Element.updateChild (package:flutter/src/widgets/framework.dart:3327:18)
E/flutter ( 9276): #44     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter ( 9276): #45     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter ( 9276): #46     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4606:5)
E/flutter ( 9276): #47     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4601:5)
E/flutter ( 9276): #48     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3569:14)
E/flutter ( 9276): #49     Element.updateChild (package:flutter/src/widgets/framework.dart:3327:18)
E/flutter ( 9276): #50     SliverMultiBoxAdaptorElement.updateChild (package:flutter/src/widgets/sliver.dart:1158:36)
E/flutter ( 9276): #51     SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1143:20)
E/flutter ( 9276): #52     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2683:19)
E/flutter ( 9276): #53     SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:1136:11)
E/flutter ( 9276): #54     RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure> (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:350:23)
E/flutter ( 9276): #55     RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1883:59)
E/flutter ( 9276): #56     PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:915:15)
E/flutter ( 9276): #57     RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1883:14)
E/flutter ( 9276): #58     RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:339:5)
E/flutter ( 9276): #59     RenderSliverMultiBoxAdaptor.insertAndLayoutChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:485:5)
E/flutter ( 9276): #60     RenderSliverFixedExtentBoxAdaptor.performLayout (package:flutter/src/rendering/sliver_fixed_extent_list.dart:259:17)
E/flutter ( 9276): #61     RenderObject.layout (package:flutter/src/rendering/object.dart:1777:7)
E/flutter ( 9276): #62     RenderSliverEdgeInsetsPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:132:12)
E/flutter ( 9276): #63     _RenderSliverFractionalPadding.performLayout (package:flutter/src/widgets/sliver_fill.dart:170:11)
E/flutter ( 9276): #64     RenderObject.layout (package:flutter/src/rendering/object.dart:1777:7)
E/flutter ( 9276): #65     RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:507:13)
E/flutter ( 9276): #66     RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1561:12)
E/flutter ( 9276): #67     RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1470:20)
E/flutter ( 9276): #68     RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1634:7)
E/flutter ( 9276): #69     PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:884:18)
E/flutter ( 9276): #70     RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:436:19)
E/flutter ( 9276): #71     WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:914:13)
E/flutter ( 9276): #72     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:302:5)
E/flutter ( 9276): #73     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1117:15)
E/flutter ( 9276): #74     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1055:9)
E/flutter ( 9276): #75     SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:971:5)
E/flutter ( 9276): #76     _rootRun (dart:async/zone.dart:1190:13)
E/flutter ( 9276): #77     _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter ( 9276): #78     _CustomZone.runGuarded (dart:async/zone.dart:997:7)
E/flutter ( 9276): #79     _invoke (dart:ui/hooks.dart:251:10)
E/flutter ( 9276): #80     _drawFrame (dart:ui/hooks.dart:209:3)

I can also provide the code that I am using that reproduces this issue here

Hopefully this helps to narrow down issues!

@alr2413
Copy link
Contributor

alr2413 commented Feb 13, 2021

yea, i checked your repo.
these errors occur because of the implementation difference between video_player & vlc_player.

you must not call the initialize method right after creating controller because the platform view is not ready yet. if you wanna initialize manually, you have to wait for a variable "isReadyToInitialize" to be set true.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants