使用ffmpeg将视频文件(Mp4)转换为.ts格式文件,并通过nginx代理在前端访问

2023-11-15

废话不多说,直接上代码:

1、编写工具类:Mp4ToTsUtils


import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;

import org.springframework.util.StringUtils;

import lombok.extern.log4j.Log4j2;

/**
 * @author zxy
 * @date 2023年7月19日 上午11:11:30
 * @Description : 视频文件转.ts文件工具类
 */
@Log4j2
public class Mp4ToTsUtils {

	/**
	 * 将视频文件转换为.ts格式文件 <BR>
	 * ffmpeg命令:ffmpeg -i output.mp4 -c copy -map 0 -f segment -segment_time 5
	 * -segment_list output.m3u8 fengniao%03d.ts
	 * 
	 * @param mp4FilePath 视频文件路径
	 * @param segmentTime 每个.ts文件的时长(秒)
	 * @return
	 */
	public static String convertVideoStreaming(String mp4FilePath, int segmentTime) {
		// 创建ts文件存放目录
		String newFolder = createTSFolder(mp4FilePath);
		if (!StringUtils.hasLength(newFolder)) {
			log.info("ts文件夹创建失败。");
			return "";
		}
		long currTime = System.currentTimeMillis();
		// 定义m3u8文件名和路径
		String m3u8Path = newFolder + "/" + currTime + ".m3u8";
		try {
			ProcessBuilder pb = new ProcessBuilder("ffmpeg", "-i", mp4FilePath, "-c", "copy", "-map", "0", "-f",
					"segment", "-segment_time", String.valueOf(segmentTime), "-segment_list", m3u8Path,
					newFolder + "/" + currTime + "%04d.ts");
			pb.redirectErrorStream(true);

			Process process = pb.start();
			BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

			String line;
			while ((line = reader.readLine()) != null) {
				log.info(line);
			}
			process.waitFor();
			log.info("视频文件转.ts文件成功。路径:{}", m3u8Path);
		} catch (IOException | InterruptedException e) {
			e.printStackTrace();
			log.error("视频文件转.ts文件失败。");
			m3u8Path = "";
		}
		return m3u8Path;
	}

	/**
	 * 创建存放ts文件的目录
	 * 
	 * @param mp4FilePath 视频文件路径
	 * @return
	 */
	public static String createTSFolder(String mp4FilePath) {
		String newPath = mp4FilePath + ".ts";
		File file2 = new File(newPath);
		if (file2.exists()) {
			return newPath;
		} else if (file2.mkdirs()) {
			return newPath;
		}
		return "";
	}

	public static void main(String[] args) {
		String mp5Path = "D:/testVedio/f50efd34.mp4";
		// createTSFolder(mp5Path);
		convertVideoStreaming(mp5Path, 5);
	}

}

2、将生成的m3u8文件通过nginx代理出去,例如通过上述代码,生成的m3u8文件会在:D:/testJar/testVedio/f50efd34.mp4.ts/1689848121446.m3u8目录,那么nginx关键配置如下:

        location /test-video/ {
                alias D:/testJar/testVedio/f50efd34.mp4.ts/;
                autoindex off;
        }

3、前端页面代码如下,代码中的地址为nginx所在服务器的IP和端口号。

<!DOCTYPE html>
<html>
<head>
    <title>TS文件播放</title>
</head>
<body>
    <video id="videoPlayer" controls></video>

    <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
    <script>
        if (Hls.isSupported()) {
            var video = document.getElementById('videoPlayer');
            var hls = new Hls();
            hls.loadSource('http://192.168.0.126:8084/test-video/1689848121446.m3u8'); // 将路径替换为生成的M3U8文件的URL

            hls.attachMedia(video);
            hls.on(Hls.Events.MANIFEST_PARSED, function () {
                video.play();
            });
        }
        else if (video.canPlayType('application/vnd.apple.mpegurl')) {
            video.src = 'http://192.168.0.126:8084/test-video/1689848121446.m3u8';
            video.addEventListener('loadedmetadata', function () {
                video.play();
            });
        }
    </script>
</body>
</html>

后面会分享一下怎么接收OBS视频流,实现直播功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用ffmpeg将视频文件(Mp4)转换为.ts格式文件,并通过nginx代理在前端访问 的相关文章

  • 如何在 Java 中验证从 Azure AD B2C 生成的 JWT 令牌?

    我正在寻找 Java 代码示例来验证 Azure AD B2C 令牌 我们可以使用哪些依赖项 所有 JWT 令牌的 JWT 令牌验证步骤或代码是否相同还是会有所不同 我们的项目中没有使用 Spring Security 有大量的图书馆her
  • CompletableFuture:whenCompleteAsync() 不允许我重新抛出异常

    我是 CompletableFuture 世界的新手 我正在尝试做一些负面测试 以允许我故意抛出异常的方式 该异常将决定通过 失败 这是代码片段 protected CompletableFuture
  • docker、nginx、django 以及如何提供静态文件

    目标 用于生产 django 网站部署的 docker 容器集 我在这个过程中遇到的问题是 通常 nginx 直接提供静态文件 根据我对使用 docker 的良好架构的理解 您将拥有一个用于 wsgi 服务器的容器 可能是gunicorn
  • cygwin有java sdk吗?

    cygwin有java sdk吗 如果有一个使用 cygwin 文件系统和 X windows 进行显示的本机 cygwin 实现 那就太好了 不幸的是我不知道这样的版本 我认为移植 OpenJDK 也需要付出很大的努力 但我还没有尝试过
  • 视频文件转换/转码 Google App Engine

    我想启动一个云计算项目 其简单任务是 接收上传的视频文件 对它们进行一些转码 转换 允许用户下载 流式传输生成的文件 我刚在想ffmpeg作为集成在的外部命令行工具Java Google App engine Application 由于很
  • 如何通过两跳 SSH 隧道使用 JProfiler

    我正在尝试将 JProfiler 连接到在我将调用的服务器上运行的 JVMremote 该服务器只能从我的工作站访问 local 通过我将调用的另一台服务器middle 我的计划是将 JProfiler 连接到remote是这样的 安装 J
  • 如何将 Cucumber 中的数据表转换为对象列表?

    原标题 Java 中的 Cucumber DataTables 中的标量是什么意思 From 参考 Java 提供了几种标量类型 这些包括原始数字 类型 加上布尔值和字符 每个标量 原始 类型都有一个关联的包装类或 参考类型 阅读javad
  • Spring批量写入器限制

    我正在工作 Spring Batch 项目 从数据库读取记录然后写入rabbitmq 然后发送到HTTP消息网关 网关有150TPS我需要将我的应用程序限制为 150TPS 有没有办法带弹簧批的油门或者还有其他更好的方法吗 你能行的 在 S
  • 从 java 类生成 xsd 的实用程序

    我想为以下类生成 xsd public class Node private String value private List
  • java.time.LocalDate 到 java.util.Date

    转换的最佳方式是什么java time LocalDate to java util Date Date from dateToReturn atStartOfDay ZoneId systemDefault toInstant 我一直在尝
  • LibGDX 闪烁

    我已经使用 LibGDX UI 设置来启动一个项目 我在实现 ApplicationListener 中唯一拥有的是 public void create setScreen new LoadingScreen this 这应该会触发 Lo
  • Poi:从 xlsm 打开 Excel 文件后将其保存为 xlsx

    我正在编写一个java程序 它打开一个用户定义的excel文件 用数据填充它 然后将其保存在用户指定的路径 文件名和扩展名下 即使输入文件是 xlsm 也应该可以声明输出保存为 xlsx 但实际上是不可能的 如果我尝试使用下面的代码 打开文
  • 如何将点击侦听器添加到 Android/Java Textview 中的字符串中?

    我想要完成的是大多数 Twitter 应用程序中的标准操作 在文本视图中 文本字符串中的单词前面可能有 提及或 主题标签 并且它们实际上能够添加点击侦听器这个词启动了另一项活动 有谁知道这是如何实现的 下面我附上了一张示例照片 显示了我想要
  • 最终类中的静态函数是否隐式最终?

    我的问题基本上与this https stackoverflow com q 8766476 3882565一 但这是否也适用于static功能 我想了解 编译器是否处理所有static函数在一个final类为final 是否添加final
  • SQLite 64位整数在jooq中被识别为int

    我有一个与 jOOQ 一起使用的 SQLite 数据库 当我使用 jOOQ 的代码生成工具时 它会按预期构建所有表和记录类 然而 所有的 SQLiteINTEGER列变成java lang Integer生成的代码中的字段 问题是 SQLi
  • Java如何区分这些具有相同名称/签名的多个方法?

    今天我在追踪一个错误 我注意到我们的一个班级中有一些奇怪的事情 我删除了尽可能多的代码并发布在这里 class A static int obtainNumber return 42 static int obtainNumber retu
  • 我的代码线程不安全吗?

    我编写了代码来理解 CyclicBarrier 我的应用程序模拟选举 每轮选出得票少的候选人 该候选人从竞争中淘汰以获得胜利 source class ElectoralCommission public volatile boolean
  • Android 中的自定义相机应用程序问题 - 旋转 270、拉伸捕获视图且未获取所有功能

    我从代码中得到了帮助https github com josnidhin Android Camera Example https github com josnidhin Android Camera Example 但面临一些问题 例如
  • 如何为用户的活动设置计时器?

    如果用户在 5 小时内停止工作 我需要执行特定的方法 假设用户已登录 但他在 5 小时内没有向数据库的特定表添加任何记录 任何时候用户将记录添加到指定的表中 该特定用户的计时器都应该重置 否则它将继续运行 如果达到 5 小时 应用程序应显示
  • 如何在 logback 中启动时滚动日志文件

    我想配置 logback 来执行以下操作 记录到文件 当文件达到 50MB 时滚动文件 仅保留 7 天的日志 启动时始终生成一个新文件 滚动 除了最后一项 启动卷 外 我一切都正常 有谁知道如何实现这一目标 这是配置

随机推荐

  • SQL笛卡尔积、内连接、左连接、右连接、全连接(速记版)

    链接
  • 配置Spring应用上下文

    配置Spring应用上下文 Spring自带了多种类型的应用上下文 下面罗列几个最有可能遇到的 AnnotationConfigApplicationContext 从一个或多个基于Java的配置类中加载Spring应用上下文 Annota
  • Ciclop开源3D扫描仪软件---Horus源码分析之src\horus\engine\calibration\autocheck.py

    c 光明工作室 2017 2037 COPYRIGHT 光明工作室团队成员大部分来自全国著名985 211工程院校 具有丰富的工程实践经验 本工作室热忱欢迎大家的光临 工作室长期承接嵌入式开发 PCB设计 算法仿真等软硬件设计 1 基于C8
  • redis 学习导航

    一 redis学习流程 二 redis官方网址 官方网址 https redis io 三 redis简介 1 redis是一个基于内存 单线程的key value的非关系型数据库 整个数据加载到内存中进行操作 读速度可以达到 11w s
  • yolov8使用C++推理的流程及注意事项

    1 下载yolov8项目源码GitHub ultralytics ultralytics NEW YOLOv8 in PyTorch gt ONNX gt OpenVINO gt CoreML gt TFLite 2 下载opencvRel
  • 【第4篇】Inception V2

    文章目录 摘要 1 简介 2 减少内部协变量偏移 3 通过小批量统计进行归一化 3 1 使用 BatchNormalized 网络进行训练和推理 3 2 批量归一化卷积网络 3 3 批量标准化可实现更高的学习率 3 4 Batch Norm
  • 华为c语言编程规范_华为自主研发编程语言“仓颉”,“中国话”将走向世界...

    近日 网上曝光华为自研编程语言名字定为 仓颉 char 项目已经进行了很久 预计明年会对外公布一些具体细节 什么是编程语言 编程语言就好比我们生活中 父母用汉语命令孩子 去写作业 这里的汉语就是是编程语言的种类 而 去写作业 这段文字是编程
  • pytorch: 保存和读取参数和模型

    一 保存和读取参数 1 当训练完后 把当前的参数保存下来 import torch torch save net state dict path 保存参数只需用到torch save 其中net为自定义的模型名称 其子参数state dic
  • linux环境下安装Android Studio

    近期将电脑的操作系统换成了Ubuntu 对于不习惯win8 win10的人来说Ubuntu确实是一个不错的选择 主要的软件都ok了 至于QQ什么的 大家能够去找wine版的 或者直接下载一个叫CrossOver的软件进行wine安装 新的操
  • 21 存在重复元素

    题目 题解 方法1 排序 如果有相邻相等的就有重复的 但O n 是nlogn 因为对数组排序呀 class Solution public bool containsDuplicate vector
  • nodejs-post文件上传原理详解

    转自 http cnodejs org topic 4f16442ccae1f4aa270010ad 基础知识 浅谈HTTP中Get与Post的区别 HTTP请求报文格式 简单介绍下 如下图 其中请求报文中的开始行和首部行包含了常见的各种信
  • 服务器里面的文件怎么传送,FTP服务器怎么传送局域网文件

    现如今 网络的使用已经十分普遍 同时也会有各种各样的局域网知识出现 比如 FTP服务器怎么传送局域网文件 学习啦小编在这里为大家详细介绍 使用局域网传送文件的朋友也许都遇过这样的悲事 自己在拷贝移动一个大的文件的时候 在最后几分钟就会完成
  • 企业数字化转型痛点,低代码平台如何解决?

    编者按 数字化能力建设整体尚处于初级阶段 虽然数字技术的发展已经从互联网 大数据时代迈入人工智能时代 但很多企业的数字化转型总体表现并不理想 那么面对数字化转型的痛点 低代码平台是如何解决的呢 来跟小编一起往下看 关键词 可视化开发 API
  • There is no ‘Animation’ attached to the “Player” game object

    There is no Animation attached to the Player game object 在照着龚老师的Unity3D投篮游戏视频教程练习时 遇到这个错误提示 我知道意思 就是player模型导入时 动画没有正确的加
  • Apache logs目录下找不见access.log文件解决办法

    Apache logs目录下找不见access log文件解决办法 原文链接请点击 https www cnblogs com ruoli s p 14561391 html 今天在做测试的时候 忽然发现 咦 我的apache服务器logs
  • 学习java和html必须要知道的英文单词(入门单词,包括C#)

    以前听说学习编程不需要记太多的英语单词 但是我在学习的时候还是碰到许多重要的编程单词 这里给大家稍微整理了一下 非常适合我们这些萌新 一 java入门基础学习单词 第一篇 public p bl k 公开 static st t k 静态
  • java代码审查

    一 概述 代码审查 Code Review 是消灭Bug最重要的方法之一 这些审查在大多数时候都特别奏效 由于代码审查本身所针对的对象 就是俯瞰整个代码在测试过程中的问题和Bug 并且 代码审查对消除一些特别细节的错误大有裨益 尤其是那些能
  • 基于Python/Tkinter的拼图单机小游戏

    这是很早之前写的拼图游戏 基于Py Tk 今天翻出来 然后重新整理 并且发布出来 供大家参考学习 自己看CSDN里有很多了类似的游戏代码 虽然代码逻辑上大同小异 但每个开发者都有自己独特的开发个性和习惯 这并无优劣 而且都可以从代码中都可以
  • Hive 调优总结2

    无需MapReduce 在hive default xml中hive fetch task conversion默认是more 老版本是minimal 该属性改为more后 在全局查找 字段查找 limit查找等都不走mapreduce E
  • 使用ffmpeg将视频文件(Mp4)转换为.ts格式文件,并通过nginx代理在前端访问

    废话不多说 直接上代码 1 编写工具类 Mp4ToTsUtils import java io BufferedReader import java io File import java io IOException import jav