iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >详解如何用Java实现对m3u8直播流抽帧
  • 870
分享到

详解如何用Java实现对m3u8直播流抽帧

Javam3u8实现直播流抽帧Javam3u8直播流抽帧Javam3u8 2023-03-06 17:03:26 870人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录什么是抽帧什么是 FFmpeg什么是 JavaCV最简单的抽帧抽帧算法什么是抽帧 抽帧(frame extraction)是指从视频流中提取一些特定的帧,通常是关键帧或者随机帧,

什么是抽帧

抽帧(frame extraction)是指从视频流中提取一些特定的帧,通常是关键帧或者随机帧,以供后续处理。对于m3u8直播流,可以使用Java中的FFmpeg库来实现抽帧功能。

什么是 FFmpeg

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。

什么是 JavaCV

JavaCV 是一款基于JavaCPP 调用方式,由多种开源计算机视觉库组成的包装库,封装了包含FFmpeg、OpenCVTensorflow、caffe、tesseract、libdc1394、OpenKinect、videoInput和ARToolKitPlus等在内的计算机视觉领域的常用库和实用程序类。

最简单的抽帧

使用 Java 中的 FFmpeg 库实现的最简单的抽帧。

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv</artifactId>
    <version>1.4.1</version>
</dependency>
import org.bytedeco.javacv.*;
import java.io.IOException;

public class FrameExtractor {
    public static void main(String[] args) throws IOException, FrameGrabber.Exception, FrameRecorder.Exception {
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("直播流地址xxx.m3u8");
        grabber.setOption("rtsp_transport", "tcp");
        grabber.start();

        Frame frame;
        Java2DFrameConverter converter = new Java2DFrameConverter();
        int i = 0;

        // grabber.grabImage() 获取帧图片,不包含音频
        // grabber.grab() 包含音频
        while ((frame = grabber.grabImage()) != null) {
            // 在这里处理抽取到的帧
            // 例如,将帧保存为图像文件
            converter.convert(frame).createGraphics().dispose();
            String outputFilename = "frame_" + i + ".jpg";
            File f = new File(outputFilename);
            if(!f.exists())f.mkdirs();
            ImageIO.write(converter.convert(frame), "jpg", f);
            i++;
        }
        grabber.stop();
    }
}

抽帧算法

什么是帧率:每秒刷新几次就是几帧。例如25帧就是每秒展示25张图片。

指定每几秒抽取几帧。这里的核心思想是,平均数累加。

假设对帧率为25的视频。要实现每3秒抽3帧。

设:帧率=fps;时间=t;t时间内抽取总帧数=x;

avg=(fps.t)/x;

只需找出 1*avg,2*avg,...,x*avg分别对应的值就找到了需要抽取的帧。

最后只需要使用一个变量对帧率计数。在指定的帧率进行抽取操作就可以了。

代码:

public class FrameExtractor {
    public static void main(String[] args) throws IOException, FrameGrabber.Exception, FrameRecorder.Exception {
        // 读取流
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("Http:.m3u8");
        grabber.setOption("rtsp_transport", "tcp");
        grabber.start();

        Frame frame;
        Java2DFrameConverter converter = new Java2DFrameConverter();

        // 控制读取帧数
        int frameRate = (int) grabber.getFrameRate();
        int targetFrameRateNum[] = {10,10}; //(每10秒读10帧) 目标帧率数量,每几秒钟读取几帧
        SortedSet<Integer> targetFrameRate = new TreeSet<>(); // 需要抽取的目标帧率
        // 计算需要抽取的目标帧
        int calFrameRate = frameRate * targetFrameRateNum[0];
        int partSize = calFrameRate / targetFrameRateNum[1];
        int remainder = calFrameRate % targetFrameRateNum[1];
        int current = 1;
        for (int i = 0; i < targetFrameRateNum[1]; i++) {
            // 避免出现帧数多一个
            if (current <= calFrameRate){
                targetFrameRate.add(current);
            }
            current += partSize;
            if (i < remainder) {
                current++;
            }
        }

        // 计数器
        int frameCount = 0;
        int i = 0;
        while ((frame = grabber.grabImage()) != null) {
            // 每读取一帧,增加计数器
            frameCount++;
            // 如果计数器达到目标帧率,则进行处理
            if (targetFrameRate.contains(frameCount)) {
                // 处理抽取到的帧

            }
            // 重置计数器
            if (calFrameRate == frameCount){
                frameCount = 0;
            }
        }

        grabber.stop();
    }
}

到此这篇关于详解如何用Java实现对m3u8直播流抽帧的文章就介绍到这了,更多相关Java m3u8直播流抽帧内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解如何用Java实现对m3u8直播流抽帧

本文链接: https://www.lsjlt.com/news/198728.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解如何用Java实现对m3u8直播流抽帧
    目录什么是抽帧什么是 FFmpeg什么是 JavaCV最简单的抽帧抽帧算法什么是抽帧 抽帧(frame extraction)是指从视频流中提取一些特定的帧,通常是关键帧或者随机帧,...
    99+
    2023-03-06
    Java m3u8实现直播流抽帧 Java m3u8直播流抽帧 Java m3u8
  • 怎么用Java实现对m3u8直播流抽帧
    本篇内容主要讲解“怎么用Java实现对m3u8直播流抽帧”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Java实现对m3u8直播流抽帧”吧!什么是抽帧抽帧(frame extraction...
    99+
    2023-07-05
  • Vue如何接入hls/m3u8的直播视频详解
    目录前言互联网网络流媒体简介播放HLS格式的视频安装实现坑总结前言 最近做了一个后台系统,需要调取工厂监控视频流显示在前端的页面上,其中遇到了一些坑,在这里做个记录,希望对前端小伙伴...
    99+
    2024-04-02
  • 如何使用PHP实现快速的直播功能?
    随着直播行业的不断发展,越来越多的企业开始尝试直播营销。而对于程序员来说,使用PHP实现直播功能是一个不错的选择。本文将介绍如何使用PHP实现快速的直播功能。了解直播的基本原理在开始使用PHP实现直播功能之前,我们首先应该了解直播的基本原理...
    99+
    2023-05-22
    PHP 直播功能 快速实现
  • 如何使用PHP实现完美的直播功能?
    近年来,直播功能已经成为了互联网应用的重要一环,它为用户提供了更加丰富的社交互动方式,也让许多行业拓展了新的业务形态。而 PHP 作为一门常用的 Web 编程语言,对于实现直播功能也有着不少的优点。本文旨在针对 PHP 程序员,介绍如何使用...
    99+
    2023-05-23
    实现方法 直播功能 PHP直播
  • 如何使用PHP实现多平台的直播功能?
    随着现代互联网的发展,视频直播已成为人们闲暇时间的主要娱乐方式之一。随着移动互联网的普及,直播在手机App中的应用成为了新互联网时代的重要标志之一。PHP作为一种常用的服务端脚本语言,有着广泛的应用。那么,如何使用PHP实现多平台的直播功能...
    99+
    2023-05-24
    直播 PHP 多平台
  • Java Red5服务器如何实现流媒体视频播放
    这篇文章主要介绍Java Red5服务器如何实现流媒体视频播放,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应...
    99+
    2023-06-14
  • 如何使用PHP实现高效可靠的直播功能?
    随着互联网技术的发展,直播已经成为越来越多人的日常娱乐、工作和生活方式。而PHP作为一种非常适合Web开发的语言,也可以用于实现高效可靠的直播功能。本文将介绍如何使用PHP实现一个基于直播的Web应用,并提供一些优化建议。一、了解直播的基本...
    99+
    2023-05-25
    实现方法 PHP直播 高效可靠
  • Java对象流如何实现序列化的类
    小编给大家分享一下Java对象流如何实现序列化的类,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java有哪些集合类Java中的集合主要分为四类:1、List列表...
    99+
    2023-06-14
  • 我们如何使用PHP实现高质量的直播功能?
    随着移动互联网的普及和网络技术的不断发展,直播应用已经成为了一种非常流行的社交方式和商业模式。而PHP是一种广泛应用于Web开发的编程语言,它具有高效稳定的特点,并且已经成为了直播应用开发的首选之一。本文将介绍如何使用PHP实现高质量的直播...
    99+
    2023-05-21
    PHP 直播功能 高质量
  • 如何在微信公众号上用PHP实现直播功能
    如何在微信公众号上用PHP实现直播功能随着科技的不断发展和智能手机的普及,直播已经成为了一种流行的社交媒体方式。很多企业和个人也开始在微信公众号上开设直播间,以吸引更多的粉丝和用户关注。本文将介绍如何用PHP实现在微信公众号上的直播功能,并...
    99+
    2023-10-26
    PHP 微信公众号 直播功能
  • 如何实现Java监听器详解
    目录一、前言二、监听器模型三、案例实现四、测试一、前言 监听器就是监听事件源是否发生了某一个事件,当发生指定监听的事件时事件源会向已注册的监听器发送消息对象。监听器可以获得事件对象进...
    99+
    2024-04-02
  • KM算法详解及如何使用java实现
    今天就跟大家聊聊有关KM算法详解及如何使用java实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。匈牙利算法基本概念二分图:二分图又称为二部图.简单来说,如果图中点可以被分为两组,...
    99+
    2023-06-19
  • 详解Java如何实现自定义注解
    目录概念作用JDK中预定义的一些注解注解生成文档案例自定义注解格式本质属性:接口中的抽象方法元注解:用于描述注解的注解在程序使用(解析)注解:获取注解中定义的属性值案例:通过自定义注...
    99+
    2024-04-02
  • Java如何对方法进行调用详解
    目录一、方法调用二、非虚方法与虚方法三、调用指令四、解析调用五、分派调用六、静态分派七、动态分派八、单分派与多分派一、方法调用 方法调用的唯一目的:确定要调用哪一个方法 方法调用分为...
    99+
    2024-04-02
  • Javascript如何实现对象扁平化实例详解
    目录前言例题详情扁平化代码实现总结前言 数组扁平化相信大家已经耳熟能详了,在被面试官问到如何实现数组扁平化你就偷着乐吧,但是相信有不少大佬在面试一些国内顶尖的大厂时,被面试官问到如何...
    99+
    2022-11-13
    js对象扁平化处理 对象扁平化 js 扁平化js
  • 详解Java如何实现FP-Growth算法
    FP-Growth算法的Java实现 这篇文章重点讲一下实现。需要两次扫描来构建FP树 第一次扫描 第一次扫描,过滤掉所有不满足最小支持度的项;对于满足最小支持度的项,按照全局支持...
    99+
    2024-04-02
  • Java使用bcrypt实现对密码加密效果详解
    目录简介bcrypt加密原理加密过程校验过程bcrypt与md5的区别示例1、引入依赖2、写测试类3、测试密文含义简介 本文用示例介绍使用对密码进行加密的算法:bcrypt。 bcr...
    99+
    2024-04-02
  • 如何在Flask中实现数据分组流程详解
    【数据库模型类】 class ConColumn(db.Model): __tablename__='content_column' id = db.Column(d...
    99+
    2023-05-19
    Flask数据分组 Flask分组数据
  • 详解如何在Java中实现懒加载
    目录Java 中如何实现懒加载使用 Supplier 接口实现懒加载使用双重检查锁定模式实现懒加载Java 中如何实现懒加载 懒加载是一种常见的优化技术,它可以延迟对象的创建或初始化...
    99+
    2023-03-19
    Java实现懒加载 Java懒加载
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作