Skip to content

[Linux] 播放时 CPU 占用相对于 mpv 高 10%+ #369

Description

@dongfengweixiao
 389951 deehy     20   0 5847900 301896 126860 S  17.2   1.1   0:04.92 fvp_example                                                                                                                                                                                                                                                                                                               
 390927 deehy     20   0 2474324 226592  69536 S   6.0   0.8   0:00.99 mpv  

播放相同的本地片源,mpv 的播放命令为 mpv --hwdec=auto assets/test_5mins.mkv,flutter 嵌入视频播放器后占用相对于 mpv,高了大概 10%。

我个人推测似乎是 flutter 在 linux 平台上的固有问题,测试 media_kit,或者是基于 video_player 的 interface 自己实现的 mpv 插件,都存在近乎相近的额外占用。

不知道个人理解是不是正确,发出来讨论讨论。

使用 example 中的循环播放 asset 下的 mkv 文件。

diff --git a/example/lib/main.dart b/example/lib/main.dart
index 8d9fa62..b58b77b 100644
--- a/example/lib/main.dart
+++ b/example/lib/main.dart
@@ -24,7 +24,7 @@ class _App extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     return DefaultTabController(
-      length: 3,
+      length: 4,
       child: Scaffold(
         key: const ValueKey<String>('home_page'),
         appBar: AppBar(
@@ -52,6 +52,7 @@ class _App extends StatelessWidget {
               ),
               Tab(icon: Icon(Icons.insert_drive_file), text: 'Asset'),
               Tab(icon: Icon(Icons.list), text: 'List example'),
+              Tab(icon: Icon(Icons.repeat), text: 'Loop mkv'),
             ],
           ),
         ),
@@ -60,6 +61,7 @@ class _App extends StatelessWidget {
             _BumbleBeeRemoteVideo(),
             _ButterFlyAssetVideo(),
             _ButterFlyAssetVideoInList(),
+            _LoopingMkvVideo(),
           ],
         ),
       ),
@@ -202,6 +204,66 @@ class _ButterFlyAssetVideoState extends State<_ButterFlyAssetVideo> {
   }
 }
 
+/// Plays the bundled `assets/test_5mins.mkv` on a loop.
+///
+/// fvp (registered in `main`) handles mkv decoding; `setLooping(true)` makes
+/// playback restart from the beginning whenever it reaches the end.
+class _LoopingMkvVideo extends StatefulWidget {
+  @override
+  _LoopingMkvVideoState createState() => _LoopingMkvVideoState();
+}
+
+class _LoopingMkvVideoState extends State<_LoopingMkvVideo> {
+  late VideoPlayerController _controller;
+
+  @override
+  void initState() {
+    super.initState();
+    _controller = VideoPlayerController.asset('assets/test_5mins.mkv');
+
+    _controller.addListener(() {
+      setState(() {});
+    });
+    _controller.setLooping(true);
+    _controller.initialize().then((_) => setState(() {}));
+    _controller.play();
+  }
+
+  @override
+  void dispose() {
+    _controller.dispose();
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return SingleChildScrollView(
+      child: Column(
+        children: <Widget>[
+          Container(
+            padding: const EdgeInsets.only(top: 20.0),
+          ),
+          const Text('Looping asset mkv'),
+          Container(
+            padding: const EdgeInsets.all(20),
+            child: AspectRatio(
+              aspectRatio: _controller.value.aspectRatio,
+              child: Stack(
+                alignment: Alignment.bottomCenter,
+                children: <Widget>[
+                  VideoPlayer(_controller),
+                  _ControlsOverlay(controller: _controller),
+                  VideoProgressIndicator(_controller, allowScrubbing: true),
+                ],
+              ),
+            ),
+          ),
+        ],
+      ),
+    );
+  }
+}
+
 class _BumbleBeeRemoteVideo extends StatefulWidget {
   @override
   _BumbleBeeRemoteVideoState createState() => _BumbleBeeRemoteVideoState();
@@ -221,7 +283,7 @@ class _BumbleBeeRemoteVideoState extends State<_BumbleBeeRemoteVideo> {
   void initState() {
     super.initState();
     _controller = VideoPlayerController.network(
-      'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4',
+      'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/vchart/landingPage/vchart-show-video.mp4',
       closedCaptionFile: _loadCaptions(),
       videoPlayerOptions: VideoPlayerOptions(mixWithOthers: true),
     );

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions