Flutter fijkplayer使用/播放RTSP降低延迟

前言
随着移动互联网和视频技术的快速发展,越来越多的开发者开始研究如何在移动端实现高效稳定的视频播放。在众多的视频播放器框架中,fijkplayer 是一个基于FFmpeg的Android视频播放器,它支持几乎所有视频格式,能够实现很低的延迟和高效的播放效果。在本篇文章中,我们将介绍如何使用fijkplayer来进行视频播放,同时也会针对延迟问题进行优化。

一、fijkplayer 简介

fijkplayer 是一款基于FFmpeg的 Android 视频播放器,它采用了 AVPlayer 模块和 IJKPlayer 模块,支持几乎所有视频格式,拥有优秀的音视频同步能力和稳定的播放性能,同时还支持 HTTP/HTTPS/RTMP 等网络协议的流媒体播放。

二、fijkplayer 的使用

1.1 在pubspec.yaml文件中添加如下代码:

fijkplayer: ^0.11.0

fijkplayer版本需对应当前的flutter版本,引入后记得put get
1.2 fijkplayer简单使用

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

void main() {
  runApp(
    MaterialApp(
      home: VideoScreen(),
    ),
  );
}
class VideoScreen extends StatefulWidget {
  
  _VideoScreenState createState() => _VideoScreenState();
}
class _VideoScreenState extends State<VideoScreen> {
  final FijkPlayer player = FijkPlayer();
  
  void initState() {
    super.initState();
    player.setDataSource('rtsp://***', autoPlay: true);
  }
  
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: Text("Fijkplayer Example")),
        body: Container(
          alignment: Alignment.center,
          child: FijkView(
            player: player,
          ),
        ));
  }

  
  void dispose() {
    super.dispose();
    player.release();
  }
}

如有设置属性,可以在FijkView中设置
三、fijkplayer 的优化,降低RTSP延迟

  void playerOption() {
    /*
     1. mediacodec-hevc: 设置使用HEVC(High Efficiency Video Coding)硬件解码器。HEVC是一种视频编码标准,允许更高的视频质量和更低的比特率。
     2.framedrop: 启用帧丢弃,允许在视频渲染过程中丢弃一些帧,以减少延迟。
     3.start-on-prepared: 在调用prepared准备后立即开始播放。
     4.opensles: 禁用OpenSL ES音频渲染器。
     5.mediacodec: 禁用媒体编解码器。
     6.packet-buffering: 禁用数据包缓冲。
     7.mediacodec-auto-rotate: 禁用自动旋转。
     8.mediacodec-handle-resolution-change: 禁用媒体编解码器处理分辨率更改。
     9.min-frames: 设置最小帧数。可能与视频渲染有关。
     10.max_cached_duration: 设置最大缓存持续时间。
     11.infbuf: 启用无限缓冲。
     12.reconnect: 设置重新连接次数。
     13.rtsp_transport: 设置RTSP传输方式为TCP。
     14.http-detect-range-support: 禁用HTTP检测范围支持。
     15.analyzeduration: 设置分析持续时间。
     16.rtsp_flags: 设置RTSP标志为"prefer_tcp",首选使用TCP传输。
     17.buffer_size: 设置缓冲区大小。
     18.max-fps: 设置最大帧速率。
     19.analyzemaxduration: 设置分析最大持续时间。
     20.dns_cache_clear: 清除DNS缓存。
     21.flush_packets: 启用刷新数据包。
     22.max-buffer-size: 设置最大缓冲区大小。
     23.fflags: 设置文件标志为"nobuffer"。
     24.probesize: 设置探测文件的大小。
     25.skip_loop_filter: 设置跳过环路滤波器。
     26.skip_frame: 设置跳过帧。
     */
    player.setOption(FijkOption.playerCategory, "mediacodec-hevc", 1);
    player.setOption(FijkOption.playerCategory, "framedrop", 1);
    player.setOption(FijkOption.playerCategory, "start-on-prepared", 0);
    player.setOption(FijkOption.playerCategory, "opensles", 0);
    player.setOption(FijkOption.playerCategory, "mediacodec", 0);
    player.setOption(FijkOption.playerCategory, "start-on-prepared", 1);
    player.setOption(FijkOption.playerCategory, "packet-buffering", 0);
    player.setOption(FijkOption.playerCategory, "mediacodec-auto-rotate", 0);
    player.setOption(
        FijkOption.playerCategory, "mediacodec-handle-resolution-change", 0);
    player.setOption(FijkOption.playerCategory, "min-frames", 2);
    player.setOption(FijkOption.playerCategory, "max_cached_duration", 3);
    player.setOption(FijkOption.playerCategory, "infbuf", 1);
    player.setOption(FijkOption.playerCategory, "reconnect", 5);
    player.setOption(FijkOption.playerCategory, "framedrop", 5);

    player.setOption(FijkOption.formatCategory, "rtsp_transport", 'tcp');
    player.setOption(FijkOption.formatCategory, "http-detect-range-support", 0);
    player.setOption(FijkOption.formatCategory, "analyzeduration", 1);
    player.setOption(FijkOption.formatCategory, "rtsp_flags", "prefer_tcp");
    player.setOption(FijkOption.formatCategory, "buffer_size", 1024);
    player.setOption(FijkOption.formatCategory, "max-fps", 0);
    player.setOption(FijkOption.formatCategory, "analyzemaxduration", 50);
    player.setOption(FijkOption.formatCategory, "dns_cache_clear", 1);
    player.setOption(FijkOption.formatCategory, "flush_packets", 1);
    player.setOption(FijkOption.formatCategory, "max-buffer-size", 0);
    player.setOption(FijkOption.formatCategory, "fflags", "nobuffer");
    player.setOption(FijkOption.formatCategory, "probesize", 200);
    player.setOption(FijkOption.formatCategory, "http-detect-range-support", 0);

    player.setOption(FijkOption.codecCategory, "skip_loop_filter", 48);
    player.setOption(FijkOption.codecCategory, "skip_frame", 0);
  }

总结
以上是对flutter使用fijkplayer使用/降低延迟的介绍,希望能帮到大家。我的需求是通过设备观看实时画面,所以对延迟要求特别高,如果有好的建议,随时提出!!!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Android程序Su

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值