[video_player_web_hls] Unable to play hls vidoes in web
ale-russ-kabbee opened this issue · 6 comments
.I'm trying to play hls videos using video_player_web in my flutter web app. But when I try to load the videos it keeps giving "TypeError: Cannot read properties of undefined (reading 'isSupported') at video_player_web_hls.VideoPlayer.new.initialize
(http://localhost:46773/packages/video_player_web_hls/video_player_web
hls.dart.li
b.js:260:37)
at video_player_web_hls.VideoPlayerPluginHls.new.create
(http://localhost:46773/packages/video_player_web_hls/video_player_web_
hls.dart.li
b.js:181:16)
at create.next ()
at runBody (http://localhost:46773/dart_sdk.js:39250:34)
at Object.async [as async]
(http://localhost:46773/dart_sdk.js:39281:7)
at video_player_web_hls.VideoPlayerPluginHls.new.create
(http://localhost:46773/packages/video_player_web_hls/video_player_web
hls.dart.li
b.js:155:20)
at video_player.VideoPlayerController.network.initialize
(http://localhost:46773/packages/video_player/video_player.dart.lib.js:
949:69)
at initialize.next ()
at runBody (http://localhost:46773/dart_sdk.js:39250:34)
at Object._async [as async]
(http://localhost:46773/dart_sdk.js:39281:7)
at video_player.VideoPlayerController.network.initialize
(http://localhost:46773/packages/video_player/video_player.dart.lib.js:
923:20)
at http://localhost:46773/packages/demotest/main.dart.lib.js:287:14
at main._VideoAppState.new.initState
(http://localhost:46773/packages/demotest/main.dart.lib.js:292:11)
at framework.StatefulElement.new.[_firstBuild]
(http://localhost:46773/packages/flutter/src/widgets/widget_span.dart.l
ib.js:53342
:54)
at framework.StatefulElement.new.mount
(http://localhost:46773/packages/flutter/src/widgets/widget_span.dart.l
ib.js:30229
:28)
at RenderObjectToWidgetElement.new.inflateWidget
(http://localhost:46773/packages/flutter/src/widgets/widget_span.dart.l
ib.js:28991
:16)
at RenderObjectToWidgetElement.new.updateChild
(http://localhost:46773/packages/flutter/src/widgets/widget_span.dart.l
ib.js:28845
:25)
at RenderObjectToWidgetElement.new.[_rebuild]
(http://localhost:46773/packages/flutter/src/widgets/widget_span.dart.l
ib.js:55830
:37)
at RenderObjectToWidgetElement.new.mount
(http://localhost:46773/packages/flutter/src/widgets/widget_span.dart.l
ib.js:55809
:29)
at
http://localhost:46773/packages/flutter/src/widgets/widget_span.dart.li
b.js:55742:
37
at framework.BuildOwner.new.buildScope
(http://localhost:46773/packages/flutter/src/widgets/widget_span.dart.l
ib.js:52787
:13)
at RenderObjectToWidgetAdapter.new.attachToRenderTree
(http://localhost:46773/packages/flutter/src/widgets/widget_span.dart.l
ib.js:55741
:17)
at binding$5.WidgetsFlutterBinding.new.attachRootWidget
(http://localhost:46773/packages/flutter/src/widgets/widget_span.dart.l
ib.js:55608
:238)
at
http://localhost:46773/packages/flutter/src/widgets/widget_span.dart.li
b.js:55601:
14
at internalCallback (http://localhost:46773/dart_sdk.js:25311:11)"
Below is the code I'm using
import 'package:video_player/video_player.dart';
import 'package:flutter/material.dart';
void main() {
runApp(VideoApp());
}
class VideoApp extends StatefulWidget {
@override
_VideoAppState createState() => _VideoAppState();
}
class _VideoAppState extends State<VideoApp> {
VideoPlayerController? _controller;
@override
void initState() {
super.initState();
try {
_controller = VideoPlayerController.network(
'https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8')
..initialize().then((_) {
// Ensure the first frame is shown after the video is initialized, even before the play button has been pressed.
setState(() {});
});
_controller!.setVolume(0.0);
} catch (e) {
print(e);
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Video Demo',
home: Scaffold(
body: Center(
child: _controller!.value.initialized
? AspectRatio(
aspectRatio: _controller!.value.aspectRatio,
child: VideoPlayer(_controller!),
)
: Container(),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
_controller!.value.isPlaying
? _controller!.pause()
: _controller!.play();
});
},
child: Icon(
_controller!.value.isPlaying ? Icons.pause : Icons.play_arrow,
),
),
),
);
}
@override
void dispose() {
super.dispose();
_controller!.dispose();
}
}
Can anyone help me how to solve this issues
You have not included
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest" type="application/javascript"></script>In index.html
<!DOCTYPE html>
<html>
<head>
<!--
If you are serving your web app in a path other than the root, change the
href value below to reflect the base path you are serving from.
The path provided below has to start and end with a slash "/" in order for
it to work correctly.
For more details:
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base
-->
<base href="/" />
<meta charset="UTF-8" />
<meta content="IE=Edge" http-equiv="X-UA-Compatible" />
<meta name="description" content="A new Flutter project." />
<!-- iOS meta tags & icons -->
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<meta name="apple-mobile-web-app-title" content="demotest" />
<link rel="apple-touch-icon" href="icons/Icon-192.png" />
<title>demotest</title>
<link rel="manifest" href="manifest.json" />
</head>
<body>
<!-- This script installs service_worker.js to provide PWA functionality to
application. For more information, see:
https://developers.google.com/web/fundamentals/primers/service-workers -->
<script>
var serviceWorkerVersion = null;
var scriptLoaded = false;
function loadMainDartJs() {
if (scriptLoaded) {
return;
}
scriptLoaded = true;
var scriptTag = document.createElement("script");
scriptTag.src = "main.dart.js";
scriptTag.type = "application/javascript";
document.body.append(scriptTag);
}
if ("serviceWorker" in navigator) {
// Service workers are supported. Use them.
window.addEventListener("load", function () {
// Wait for registration to finish before dropping the <script> tag.
// Otherwise, the browser will load the script multiple times,
// potentially different versions.
var serviceWorkerUrl =
"flutter_service_worker.js?v=" + serviceWorkerVersion;
navigator.serviceWorker.register(serviceWorkerUrl).then((reg) => {
function waitForActivation(serviceWorker) {
serviceWorker.addEventListener("statechange", () => {
if (serviceWorker.state == "activated") {
console.log("Installed new service worker.");
loadMainDartJs();
}
});
}
if (!reg.active && (reg.installing || reg.waiting)) {
// No active web worker and we have installed or are installing
// one for the first time. Simply wait for it to activate.
waitForActivation(reg.installing ?? reg.waiting);
} else if (!reg.active.scriptURL.endsWith(serviceWorkerVersion)) {
// When the app updates the serviceWorkerVersion changes, so we
// need to ask the service worker to update.
console.log("New service worker available.");
reg.update();
waitForActivation(reg.installing);
} else {
// Existing service worker is still good.
console.log("Loading app from service worker.");
loadMainDartJs();
}
});
// If service worker doesn't succeed in a reasonable amount of time,
// fallback to plaint <script> tag.
setTimeout(() => {
if (!scriptLoaded) {
console.warn(
"Failed to load app from service worker. Falling back to plain <script> tag."
);
loadMainDartJs();
}
}, 4000);
});
} else {
// Service workers not supported. Just drop the <script> tag.
loadMainDartJs();
}
</script>
<script
src="https://cdn.jsdelivr.net/npm/hls.js@latest"
type="application/javascript"
></script>
</body>
</html>
I added <script src="https://cdn.jsdelivr.net/npm/hls.js@latest" type="application/javascript"></script> but the problem is still there
Try adding this script tag before end of head. If that doesn't work i will check this on 20th .
I tried still not working
Fixed the issue. Apparently all it needed was flutter clean and now its working as expected