【问题标题】:Video stuttering in webview on Android?Android上的webview中的视频口吃?
【发布时间】:2020-01-07 19:51:53
【问题描述】:

我正在开发一个应用程序,该应用程序显示网页的 web 视图,该网页以幻灯片形式显示 1080p 视频。由于某种原因,我无法使视频在 webview 中流畅播放。如果我在 Kodi 或 VLC 等应用程序中播放相同的视频,它会播放得非常流畅。该设备本身最多可以处理 4K 视频。 但是在 android webview 中播放一个简单的 1080p 短视频时会出现严重的卡顿。

该应用程序是在 Flutter 中开发的,我尝试了 flutter_webview_plugin 和 stock webview_flutter,结果相同。

我在AndroidManifest.xml 中也有android:hardwareAccelerated="true"

该设备是配备 Amlogic S905X2(4x Arm Cortex-A53 @ 1.80 GHz + Mali-G31 MP2 + 4GB RAM)的电视盒,其硬件应该可以轻松处理此问题。这些视频是 MP4 格式,而且很小,在其他任何地方都可以很好地播放。

我还能尝试什么?

【问题讨论】:

  • 您使用 webview 加载视频而不是直接在 Flutter 上播放视频是否有特定原因?

标签: android-studio flutter webview android-webview


【解决方案1】:

我不确定您为什么要在 WebView 上播放视频,而不是在 Flutter 中本地播放。但这里有一个使用 video_player 包直接在 Flutter 中流式传输视频的示例:

import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';


void main() {
  runApp(
    MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: MyApp(),
      ),
    ),
  );
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  VideoPlayerController _videoPlayerController;
  bool _playing = false;

  @override
  void initState() {
    _videoPlayerController = VideoPlayerController.network("https://static.videezy.com/system/resources/previews/000/005/621/original/Coffee_Smokey_BRoll.mp4");
    _videoPlayerController.initialize();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Video player'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            _videoPlayerController.value.initialized
              ? AspectRatio(
                aspectRatio: _videoPlayerController.value.aspectRatio,
                child: VideoPlayer(_videoPlayerController),
              )
              : Container(),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                FlatButton.icon(
                  onPressed: () => _playing ? pauseVideo() : playVideo(),
                  icon: _playing ?  Icon(Icons.pause): Icon(Icons.play_arrow),
                  label: _playing ? Text('Pause') : Text('Play')
                ),
              ],
            ),
          ],
        ),
      )
    );
  }

  void playVideo(){
    _videoPlayerController.play();
    setState(() {
      _playing = true;
    });
  }

  void pauseVideo(){
    _videoPlayerController.pause();
    setState(() {
      _playing = false;
    });
  }
}

我不确定您所说的幻灯片是指该视频是幻灯片,还是您希望每张幻灯片播放多张视频。

【讨论】:

  • 感谢@João 的回复。 webview 的原因是我开发了一个显示图片和视频幻灯片的多平台服务。当内容从网站提供时,它们在 webview 中播放。而且它可以与图片混合搭配,如果我不想为每个设备创建特定的解决方案,这使得视频播放器很难做到。 webview 在播放视频时表现更差是有原因的吗?我的意思是一个简单的预算笔记本电脑可以用 Chrome 处理它,为什么现代移动 CPU 不能处理这个?
  • iOS 和 Android 上的大多数 WebView 的性能都不是很好。它们与现代浏览器非常不同,而且绝对没有优化。如果您的应用程序只是网页的包装器,也许您可​​以尝试直接在 Android 上运行一个网络包装器应用程序的实验。网上有很多关于它的教程。这样你就可以通过 Flutter 对比原生 webview 和 webview 的性能,判断问题是 Flutter 还是只是在 webview 上播放视频。
  • 是的,我实际上在 android 上尝试了一个 web wrapper,结果相同。还在设备上使用 Chrome 会导致播放视频时断断续续。最不卡顿的是火狐。所以有些东西没有正确优化。但是该设备确实可以完美地处理除此之外的所有事情。还在安卓手机和平板电脑上试过。同样的事情。
  • 就像我说的。 Webviews 与标准浏览器不同。您会发现不仅在性能方面存在许多差异,而且在处理 javascript 的方式和其他方面也存在许多差异。如果您想为您的用户提供良好的用户体验,请尝试更多地学习 Flutter,并从您的 API 中获取您的数据,并在本地使用它来播放视频和展示您的内容。我相信它会很棒。
  • 有没有 webview 的替代品,您可以在其中获得与真实浏览器相同的性能,而无需重新设计我已经制作的所有内容?
猜你喜欢
  • 2013-03-04
  • 2015-06-16
  • 2011-05-29
  • 2017-09-02
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多