**您好,我正在尝试在我的 flutter 应用程序中播放实时新闻视频,它是 .m3u8 格式,但出现上述错误。使用所有更新的依赖项。我想在我的 flutter 应用程序中播放实时新闻。我有网址你也可以试试。URL: http: //161.97.162.167:1936/ live/tnnnews/playlist.m3u8 当我使用另一个带有 .m3u8 的 url 时,它会在 flutter 应用程序上播放,但是当我粘贴实时 url 代码时,它会抛出上述错误。**
代码
import 'package:video_player/video_player.dart';
import 'package:flutter/material.dart';
class VideoApp extends StatefulWidget {
@override
_VideoAppState createState() => _VideoAppState();
}
class _VideoAppState extends State<VideoApp> {
VideoPlayerController _controller;
@override
void initState() {
super.initState();
_controller = VideoPlayerController.network(
'http://161.97.162.167:1936/live/tnnnews/playlist.m3u8')
..initialize().then((_) {
// Ensure the first frame is shown after the video is initialized, even before the play button has been pressed.
setState(() {});
});
}
@override
Widget build(BuildContext …Run Code Online (Sandbox Code Playgroud) 有谁知道如何在列表中进行 Flutter 视频缓存 4 到 6 秒?(接下来的 5 个视频)如 Instagram 视频。
有什么办法可以做到吗?
我使用PageView.builder来显示一个完整页面的视频。
我尝试过一个cached_video_player,但它正在加载完整的视频。
这是我所做的。
视频小部件:
typedef OnVideoCompleted = void Function();
class VideoWidget extends StatefulWidget {
//final bool? play;
final bool? isDuetVideo;
final String? url;
final OnVideoCompleted? onVideoCompleted;
final HomeWidgetBloc? homeWidgetBloc;
const VideoWidget(
{Key? key,
this.onVideoCompleted,
required this.url,
required this.homeWidgetBloc,
required this.isDuetVideo})
: super(key: key);
@override
_VideoWidgetState createState() => _VideoWidgetState();
}
class _VideoWidgetState extends State<VideoWidget> {
late VideoPlayerController videoPlayerController;
late Future<void> _initializeVideoPlayerFuture;
final _controllerStateStream = BehaviorSubject<int>.seeded(0); …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 iOS 模拟器上运行我的 Flutter 应用程序,我发现视频播放器在 init 上抛出以下异常:
\n[VERBOSE-2:ui_dart_state.cc(209)] Unhandled Exception: PlatformException(VideoError, Failed to load video: The operation could not be completed, null, null)\nRun Code Online (Sandbox Code Playgroud)\n经过一番谷歌搜索后,我发现可能有几个修复方法:
\n我正在运行最新的 flutter 版本,降级插件也没有做任何事情。我通过在浏览器中播放视频来确保 Web 服务器确实支持 Range 标头。
\n我还在 flutter DevTools 中检查了网络请求,似乎从未发出过网络请求(看看其他 API 请求工作正常)。
\n另一个注意事项是,这个问题不会发生在 Android 模拟器/真实设备上,并且视频播放得很好。
\n什么可能导致此问题?有没有可能的方法来启用更详细的日志记录以查看到底是什么原因导致问题,或者是否有我遗漏的内容?谢谢您的帮助。
\n附加信息:
\n2.6.0-12.0.pre.899在 master 分支上颤动如何通过区域、存储桶 ID、访问密钥和秘密密钥对 IAM 角色用户进行身份验证,并获取视频文件对象并在视频播放器中播放。实际上,我们已经在 AWS S3 中上传了视频文件,并向一名 IAM 角色用户授予了访问权限。
现在,在 flutter 应用程序中,我需要通过 accesskey、secretkey 对 IAM 用户进行身份验证,并获取视频对象并在视频播放器中播放,而无需在本地保存或下载。
我尝试使用插件,
flutter_aws_s3_client: ^0.5.0
const region = "<region>";
const bucketId = "<bucket id>";
final AwsS3Client s3client = AwsS3Client(
region: region,
host: "s3.$region.amazonaws.com",
bucketId: bucketId,
accessKey: "<accesskey>",
secretKey: "<secretkey>");
//object video name
final response = await s3client.getObject("example_test.m3u8");
Run Code Online (Sandbox Code Playgroud)
这里我得到的对象响应为 200,但是我如何传递并在视频播放器中播放这个视频文件?有什么办法吗?我尝试在expo播放器android video_player_plugin.dart中添加标题。但没有运气。
视频播放器插件
video_player: ^0.10.11+1
class _VideoAppState extends State<VideoApp> {
VideoPlayerController _controller;
@override
void initState() {
super.initState();
_controller = VideoPlayerController.network('//need to pass the videoUrl of AWS S3')
..initialize().then((_) …Run Code Online (Sandbox Code Playgroud) 这是我正在尝试使用的代码,flutter vlc player但它不起作用,所以任何人都可以帮助我解决问题,或者我可以用另一种方式显示流?
所以你们可以给我任何建议或举一些小例子。我过去两个小时试图解决这个问题,但没有成功
import 'package:flutter/material.dart';
import 'package:flutter_vlc_player/flutter_vlc_player.dart';
import 'package:flutter_vlc_player/vlc_player.dart';
import 'package:flutter_vlc_player/vlc_player_controller.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
VlcPlayerController _videoPlayerController;
@override
void initState() { …Run Code Online (Sandbox Code Playgroud) 我正在为使用 video_player 插件的视频播放器小部件编写一个简单的测试。我无法模拟视频控制器发出的用于通过网络获取视频的网络请求。我的小部件代码如下所示:
late VideoPlayerController _videoController;
@override
void initState() {
_videoController = VideoPlayerController.network(widget.videoUrl);
// rest of the code
}
Run Code Online (Sandbox Code Playgroud)
和测试代码:
VideoPlayerController _videoController =
VideoPlayerController.network(videoUrl);
when(VideoPlayerController.network(videoUrl))
.thenAnswer((_) => _videoController);
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为它无法正确地存根网络请求方法。有什么正确嘲笑它的想法吗?我的代码中还有其他几个测试,其中我模拟了发出网络请求的 api 客户端类,但这一个有点不同。我正在使用mockito进行嘲笑。
请帮忙!
unit-testing flutter-test flutter-video-player flutter-mockito
我一直在与“官方”flutter video_player包与 PageView 小部件结合使用时遇到严重的卡顿问题。
平滑快速地滚动浏览PageView 小部件的多个页面,每个页面都包含一个视频小部件。
当我尝试快速滚动这些页面时,我遇到了严重的卡顿/性能问题。当我缓慢地滑动页面并等待滚动动画完成时,一切都很顺利。请参阅我在小米红米 Note 8 Pro 的个人资料模式下录制的视频作为证据。
我尝试通过咨询颤振性能工具来寻求帮助。该工具显示光栅时间出现大量峰值。在一个示例中,光栅时间为 51.7 毫秒,其中 43.0 毫秒用于着色器编译。不过,我的经验不足,无法理解这意味着什么或这些信息如何帮助我。截图如下:
controller.dispose();可以解决问题,但这会导致内存泄漏和小部件最终崩溃。controller.dispose();成 a WidgetsBinding.instance!.addPostFrameCallback((_) async {},但这没有帮助import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
class ExamplePageView extends StatelessWidget {
ExamplePageView({Key? key}) : super(key: key);
final PageController pageController = PageController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
height: MediaQuery.of(context).size.height,
child: PageView(
controller: pageController,
onPageChanged: (value) {}, …Run Code Online (Sandbox Code Playgroud) performance flutter jank flutter-pageview flutter-video-player
我正在使用 video_player 包在 flutter 中播放网络视频。在安卓上运行良好,但在ios上无法加载。
颤动3.3.3
视频播放器:^2.4.7
PS:服务器调用是https,问题发生在真实设备中,并且响应标头具有Accept-Ranges :字节
要求
连接:关闭
访问控制允许来源:*
接受:/
接受编码:身份
接受语言:en-US,en;q=0.9
访问控制允许凭据:true
范围:字节=0-1
服务器端响应
接受:应用程序/pdf,应用程序/八位字节流接受范围:字节缓存控制:无缓存,无存储,最大年龄= 0,必须重新验证
连接:保持活动内容处置:内联;文件名 =“DeviceMediaActivity_99966.MOV”内容长度:1706570 内容类型:应用程序/八位字节流
日期:星期五,2022 年 10 月 14 日 04:28:14 GMT 过期:0 保持活动:超时 = 60 杂注:无缓存变化:起源,访问控制请求方法,访问控制请求标头
x-content-type-options:nosniff x-frame-options:DENY
x-xss-protection:1;模式=块
以下经典代码片段无法从 Bunny CDN 获取视频
@override
void initState() {
super.initState();
controller = VideoPlayerController.networkUrl(Uri.parse(widget.video),
httpHeaders: {"AccessKey": CDN_READ_ONLY_TOKEN});
controller.initialize();
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
E/ExoPlayerImplInternal(14202): Playback error
E/ExoPlayerImplInternal(14202): com.google.android.exoplayer2.ExoPlaybackException: Source error
E/ExoPlayerImplInternal(14202): at com.google.android.exoplayer2.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:644)
E/ExoPlayerImplInternal(14202): at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:616)
E/ExoPlayerImplInternal(14202): at android.os.Handler.dispatchMessage(Handler.java:103)
E/ExoPlayerImplInternal(14202): at android.os.Looper.loop(Looper.java:224)
E/ExoPlayerImplInternal(14202): at android.os.HandlerThread.run(HandlerThread.java:67)
E/ExoPlayerImplInternal(14202): Caused by: com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 401
E/ExoPlayerImplInternal(14202): at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:413)
E/ExoPlayerImplInternal(14202): at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:263)
E/ExoPlayerImplInternal(14202): at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:84)
E/ExoPlayerImplInternal(14202): at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1005)
E/ExoPlayerImplInternal(14202): at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:412)
E/ExoPlayerImplInternal(14202): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
E/ExoPlayerImplInternal(14202): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
E/ExoPlayerImplInternal(14202): at java.lang.Thread.run(Thread.java:919)
Run Code Online (Sandbox Code Playgroud)
我认为问题出在 accessKey 上,但是:
在检查了 github …
是否可以使用 flutter video_player 跳转到某个时间戳并显示帧而不启动视频?
只有当我在seekTo之后立即调用play时,我才能更改帧。
_videoPlayerController.seekTo(Duration(milliseconds: value));
_videoPlayerController.play();
Run Code Online (Sandbox Code Playgroud)
我也尝试过
_videoPlayerController.seekTo(Duration(milliseconds: value));
_videoPlayerController.play();
_videoPlayerController.pause();
Run Code Online (Sandbox Code Playgroud)
但它不会改变视频的显示帧。
flutter ×9
dart ×3
android ×2
amazon-s3 ×1
bunnycdn ×1
caching ×1
exoplayer ×1
flutter-ios ×1
flutter-test ×1
ios ×1
jank ×1
m3u8 ×1
performance ×1
rtsp ×1
unit-testing ×1