前言
随着移动互联网和视频技术的快速发展,越来越多的开发者开始研究如何在移动端实现高效稳定的视频播放。在众多的视频播放器框架中,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使用/降低延迟的介绍,希望能帮到大家。我的需求是通过设备观看实时画面,所以对延迟要求特别高,如果有好的建议,随时提出!!!