当前位置: 首页 > news >正文

Java转成m3u8,hls格式

Java转成m3u8,hls格式

需求分析

大致思路

  1. 循环文件夹下面所有文件
  2. 判断当前文件是否是视频文件,如果是视频文件先转为ts文件
    • 因为听别人说先转成ts之后再切片会快很多
  3. 转成ts文件,并为这些文件单独生成一个目录,如果目录不存在则新建一个目录
    • 执行转换命令—转成ts文件
  4. 执行完成后,再将ts文件转成m3u8文件

详细流程

  1. 判断当前文件夹是否是一个目录
  2. 如果是目录就遍历下面的文件包括所以的文件。
  3. 循环这些子文件,如果当前的文件是文件并且是视频文件(写一个判断函数,因为格式不同)
  4. 循环完成后将这些视频转成ts,并为这些文件生成单独目录,转成ts文件命名为output.ts
    • 需要为这些文件单独写一个执行命令函数(封装)
  5. 转成ts后再将这些视频转成m3u8

方法实现

判断是否为文件函数

在类中定义正则表达式,以方便修改。

函数中使用文件名后缀方式判断当前文件是否是符合要求的视频文件。

// 判断是否是视频文件正则
private static String isVideoFileRegex = ".*\\.(mp4|avi|mkv)$";/*** 判断是否符合想要的格式* mp4|avi|mkv* 通过文件后缀名哦安短** @param fileName 文件名称* @return 布尔值*/
private static boolean isVideoFile(String fileName) {return fileName.matches(isVideoFileRegex);
}

执行命令函数

因为在使用过程中需要使用两次命令行的操作,使用Java调起命令行,这是可以封装成单独的函数,使用时只需要将命令行传入即可。

命令行解释

创建了一个 ProcessBuilder 对象,并使用给定的命令字符串初始化它。ProcessBuilder 类用于创建操作系统进程,并提供一种从 Java 程序中启动外部命令的方式。

command.split(" ") 将输入的命令字符串分割成一个字符串数组,每个数组元素都是一个命令或参数。然后,这个数组被用来初始化 ProcessBuilder 对象,以便在后续步骤中启动一个新的进程来执行这些命令。

processBuilder.redirectErrorStream(true) 设置了当启动的进程产生错误流时,将错误流合并到标准输出流中。这意味着在执行命令时,任何由该命令生成的错误输出将会与标准输出一起被捕获,并可以通过 Java 程序进行处理。

ProcessBuilder processBuilder = new ProcessBuilder(command.split(" "));
processBuilder.redirectErrorStream(true);
  1. processBuilder.start() 启动了之前创建的 ProcessBuilder 对象,执行之前设置的命令。
  2. BufferedReader 对象将其连接到外部进程的标准输出流,程序可以读取外部进程的输出。这里使用了 InputStreamReader 将字节流转换为字符流,然后通过 BufferedReader 逐行读取外部进程的输出。
  3. 在一个 while 循环中,程序持续读取外部进程的输出,直到输出结束。每读取一行输出,该行内容被打印到控制台上。
  4. 之后,通过调用 process.waitFor(),程序会等待外部进程执行完毕。这会导致当前的线程暂停,直到外部进程执行完成。
try {Process process = processBuilder.start();// 将ffmpeg执行内容输出在控制台中BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}// 等待转换完成process.waitFor();
} catch (IOException | InterruptedException e) {throw new RuntimeException(e);
}
完整代码
// 输入文件夹
private static String inputDirectory = "C:\\Users\\13199\\Downloads";
// 输出m3u8文件
private static String outputM3u8FileName = "index.m3u8";
// 判断是否是视频文件正则
private static String isVideoFileRegex = ".*\\.(mp4|avi|mkv)$";
// 选择切片时间
private static Integer HlsTime = 1;/*** 执行将文件转成m3u8 hls格式** @param command Ffmpeg 命令*/
private static void executeFfmpegCommand(String command) {ProcessBuilder processBuilder = new ProcessBuilder(command.split(" "));processBuilder.redirectErrorStream(true);try {Process process = processBuilder.start();// 将ffmpeg执行内容输出在控制台中BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}// 等待转换完成process.waitFor();} catch (IOException | InterruptedException e) {throw new RuntimeException(e);}
}

转成ts

  1. 根据输入文件路径 inputFilePath 确定了输出目录 outputDirectory。使用正则表达式 \\.[^.]+$ 来匹配文件路径中的文件扩展名,并将其替换为空字符串,从而得到输出目录的路径。
  2. 创建了一个 File 对象来代表输出目录,并检查该目录是否存在。如果输出目录不存在,用 mkdirs() 方法来创建输出目录。
  3. 构建了一个输出文件的路径 outputFilePath,这里假设输出文件的名称为 “output.ts”,并将其放在之前确定的输出目录中。
  4. FFmpeg 命令字符串 command,该命令使用输入文件路径来进行转换,具体命令包括了输入文件、编解码器选项、关键帧选项等参数。
  5. executeFfmpegCommand 将构建的 FFmpeg 命令字符串作为参数传递给该方法,以执行 FFmpeg 命令。
  6. 最后,代码调用了一个名为 convertToM3U8 的方法,该方法可能用于将生成的视频文件转换为 M3U8 格式
// 输入文件夹
private static String inputDirectory = "C:\\Users\\13199\\Downloads";
// 输出m3u8文件
private static String outputM3u8FileName = "index.m3u8";
// 判断是否是视频文件正则
private static String isVideoFileRegex = ".*\\.(mp4|avi|mkv)$";
// 选择切片时间
private static Integer HlsTime = 1;/*** 如果文件名 后缀符合将文件先转成ts类型文件* 有实验表名,先转成ts会快一点** @param inputFilePath 当前文件的路径*/
private static void convertToTs(String inputFilePath) {String outputDirectory = inputFilePath.replaceFirst("\\.[^.]+$", "");File directory = new File(outputDirectory);if (!directory.exists()) {directory.mkdirs();}String outputFilePath = outputDirectory + File.separator + "output.ts";String command = "ffmpeg -i " + inputFilePath + " -c copy -bsf:v h264_mp4toannexb -force_key_frames expr:gte(t,n_forced*" + HlsTime + ") -f mpegts " + outputFilePath;executeFfmpegCommand(command);convertToM3U8(outputDirectory);
}

转成m3u8

输出文件的路径 outputFilePath,这个路径是由输入目录 inputDirectory 和一个名为 outputM3u8FileName

之后将这段代码放到之前封装好的执行命令函数中executeFfmpegCommand

// 输入文件夹
private static String inputDirectory = "C:\\Users\\13199\\Downloads";
// 输出m3u8文件
private static String outputM3u8FileName = "index.m3u8";
// 判断是否是视频文件正则
private static String isVideoFileRegex = ".*\\.(mp4|avi|mkv)$";
// 选择切片时间
private static Integer HlsTime = 1;/*** 将文件转成hls类型,并且m3u8命名为index* 切片的ts以output.ts转换** @param inputDirectory 输入的文件夹*/
private static void convertToM3U8(String inputDirectory) {// 使用FFmpeg将ts文件转换成m3u8文件String outputFilePath = inputDirectory + File.separator + outputM3u8FileName;String command = "ffmpeg -i " + inputDirectory + File.separator + "output.ts" + " -c:v libx264 -c:a aac -force_key_frames expr:gte(t,n_forced*" + HlsTime + ") -hls_time " + HlsTime + " -hls_list_size 0 -f hls " + outputFilePath;executeFfmpegCommand(command);
}
自定义ts输出名

需要使用-hls_segment_filename参数。这个参数可以帮助你自定义切片文件的命名规则。

如果要将输入的ts文件以1,2,3这种方式命名可以使用这个方法inputDirectory + File.separator + "%d.ts"

String segmentFilename = inputDirectory + File.separator + "%d.ts"; // 定义切片文件名规则
String command = "ffmpeg -i " + inputDirectory + File.separator + "output.ts" + " -c:v libx264 -c:a aac -force_key_frames expr:gte(t,n_forced*1) -hls_time 1 -hls_list_size 0 -f hls -hls_segment_filename " + segmentFilename + " " + outputFilePath; // 定义切片文件名规则
executeFfmpegCommand(command);

主函数

  1. 创建了一个 File 对象来代表输入目录 inputDirectory
  2. 检查输入目录是否存在,并且确保它是一个目录而不是一个文件。
  3. 如果输入目录存在且是一个目录,获取了该目录下的所有文件列表,并遍历这些文件。
  4. 在遍历文件列表时,对每个文件进行检查,确保它是一个文件并且文件扩展名表明它是一个视频文件(使用了 isVideoFile 方法进行检查)。
  5. 对于每个找到的视频文件,代码创建了一个新的线程,并在该线程中调用了 convertToTs 方法,传递视频文件的绝对路径作为参数,以启动视频文件的转换过程。
// 输入文件夹
private static String inputDirectory = "C:\\Users\\13199\\Downloads";
// 输出m3u8文件
private static String outputM3u8FileName = "index.m3u8";
// 判断是否是视频文件正则
private static String isVideoFileRegex = ".*\\.(mp4|avi|mkv)$";
// 选择切片时间
private static Integer HlsTime = 1;/*** 定义目录所在位置* 循环遍历这个目录文件,找到子目录的视频文件* 判断当前的文件是否是视频文件* 如果是文件夹则继续遍历** @param args main program arguments*/
public static void main(String[] args) {File directory = new File(inputDirectory);if (directory.isDirectory()) {File[] files = directory.listFiles();assert files != null;for (File file : files) {if (file.isFile() && isVideoFile(file.getName())) {String inputFilePath = file.getAbsolutePath();new Thread(() -> convertToTs(inputFilePath)).start();}}}
}

常规变量

// 输入文件夹
private static String inputDirectory = "C:\\Users\\13199\\Downloads";
// 输出m3u8文件
private static String outputM3u8FileName = "index.m3u8";
// 判断是否是视频文件正则
private static String isVideoFileRegex = ".*\\.(mp4|avi|mkv)$";
// 选择切片时间
private static Integer HlsTime = 1;

完整代码

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;@Data
public class NewTest {// 输入文件夹private static String inputDirectory = "C:\\Users\\13199\\Downloads";// 输出m3u8文件private static String outputM3u8FileName = "index.m3u8";// 判断是否是视频文件正则private static String isVideoFileRegex = ".*\\.(mp4|avi|mkv)$";// 选择切片时间private static Integer HlsTime = 1;/*** 定义目录所在位置* 循环遍历这个目录文件,找到子目录的视频文件* 判断当前的文件是否是视频文件* 如果是文件夹则继续遍历** @param args main program arguments*/public static void main(String[] args) {File directory = new File(inputDirectory);if (directory.isDirectory()) {File[] files = directory.listFiles();assert files != null;for (File file : files) {if (file.isFile() && isVideoFile(file.getName())) {String inputFilePath = file.getAbsolutePath();new Thread(() -> convertToTs(inputFilePath)).start();}}}}/*** 如果文件名 后缀符合将文件先转成ts类型文件* 有实验表名,先转成ts会快一点** @param inputFilePath 当前文件的路径*/private static void convertToTs(String inputFilePath) {String outputDirectory = inputFilePath.replaceFirst("\\.[^.]+$", "");File directory = new File(outputDirectory);if (!directory.exists()) {directory.mkdirs();}String outputFilePath = outputDirectory + File.separator + "output.ts";String command = "ffmpeg -i " + inputFilePath + " -c copy -bsf:v h264_mp4toannexb -force_key_frames expr:gte(t,n_forced*" + HlsTime + ") -f mpegts " + outputFilePath;executeFfmpegCommand(command);convertToM3U8(outputDirectory);}/*** 将文件转成hls类型,并且m3u8命名为index* 切片的ts以output.ts转换** @param inputDirectory 输入的文件夹*/private static void convertToM3U8(String inputDirectory) {// 使用FFmpeg将ts文件转换成m3u8文件String outputFilePath = inputDirectory + File.separator + outputM3u8FileName;String command = "ffmpeg -i " + inputDirectory + File.separator + "output.ts" + " -c:v libx264 -c:a aac -force_key_frames expr:gte(t,n_forced*" + HlsTime + ") -hls_time " + HlsTime + " -hls_list_size 0 -f hls " + outputFilePath;executeFfmpegCommand(command);}/*** 执行将文件转成m3u8 hls格式** @param command Ffmpeg 命令*/private static void executeFfmpegCommand(String command) {ProcessBuilder processBuilder = new ProcessBuilder(command.split(" "));processBuilder.redirectErrorStream(true);try {Process process = processBuilder.start();// 将ffmpeg执行内容输出在控制台中BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}// 等待转换完成process.waitFor();} catch (IOException | InterruptedException e) {throw new RuntimeException(e);}}/*** 判断是否符合想要的格式* mp4|avi|mkv* 通过文件后缀名哦安短** @param fileName 文件名称* @return 布尔值*/private static boolean isVideoFile(String fileName) {return fileName.matches(isVideoFileRegex);}
}

相关文章:

Java转成m3u8,hls格式

Java转成m3u8,hls格式 需求分析 大致思路 循环文件夹下面所有文件判断当前文件是否是视频文件,如果是视频文件先转为ts文件 因为听别人说先转成ts之后再切片会快很多 转成ts文件,并为这些文件单独生成一个目录,如果目录不存在则新建一个目…...

jmeter之接口测试实现参数化(利用函数助手),参数值为1-9(自增的数字)

1.前言 思考:为什么不用postman,用postman的话就得导入csv文件/json文件 如果不想导入文件,postman是实现不了,因为postman每次只会运行一次 2.jmeter函数助手实现参数化 (1)新建“线程组”--新建“http…...

如何在 Ubuntu 22.04 上安装 Apache Web 服务器

前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。 如何在 Ubuntu 22.04 上安装 Apache Web 服务器 介绍 Apache HTTP 服务器是世界上使用最广泛的 Web 服务器。它…...

【python爬虫】爬虫编程技术的解密与实战

​🌈个人主页:Sarapines Programmer🔥 系列专栏: 爬虫】网络爬虫探秘⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 🌼实验目的 &#x1f…...

VisualSVN Server下载安装和使用方法、服务器搭建、使用TortoiseSvn将项目上传到云端服务器、各种错误解决方法

VisualSVN Server下载安装和使用方法、服务器搭建、使用TortoiseSvn将项目上传到云端服务器、各种错误解决方法 0.写在前面00.电脑配置01.思路 1.VisualSVN Server下载安装01.下载02.安装03.电脑命名不能有中文04.制作VisualSVN Server快捷方式05.License limits exceeded, Som…...

Python模块与包:扩展功能、提高效率的利器

文章目录 一、引言1.1 模块与包对于Python开发的重要性1.2 Python作为拥有丰富生态系统的编程语言 二、为什么学习模块与包2.1 复用代码:利用现有模块与包加速开发过程2.2 扩展功能:通过模块与包提供的功能增强应用的能力 三、模块的使用3.1 导入模块&am…...

【每日一题】4.LeetCode——杨辉三角

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点&…...

蓝桥杯(Python)每日练Day5

题目 OJ1229 题目分析 题目完全符合栈的特征,后进先出。如果能够熟练使用列表的9种方法那么这道题很容易解出。 题解 a[]#存衣服 nint(input()) for i in range(n):llist(input().split())#判断每一步的操作if len(l[0])2:a.append(l[1])else:while a.pop()!l…...

SpringCloud(二)

Spring Cloud 文章目录 Spring Cloud任务三:Spring Cloud与微服务架构1.Spring Cloud课程内容介绍2.单体应用架构2.1 互联网应用架构演进2.2 单体应用架构 3.垂直应用架构4.SOA应用架构5.微服务应用架构介绍6.微服务架构核心思想及优缺点7.微服务架构的核心概念8.Sp…...

【java】常见的面试问题

目录 一、异常 1、 throw 和 throws 的区别? 2、 final、finally、finalize 有什么区别? 3、try-catch-finally 中哪个部分可以省略? 4、try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗&#…...

虚幻UE 插件-像素流送实现和优化

本笔记记录了像素流送插件的实现和优化过程。 UE version:5.3 文章目录 一、像素流送二、实现步骤1、开启像素流送插件2、设置参数3、打包程序4、打包后的程序进行像素流参数设置5、下载NodeJS6、下载信令服务器7、对信令服务器进行设置8、启动像素流送 三、优化1、…...

Vue2 props组件通信

一、父组件向子组件传值 1、流程图 2、父组件代码 <template><div class"app"><UserInfo:usernameusername:ageage:isSingleisSingle:carcar:hobbyhobby></UserInfo></div> </template><script> import UserInfo from .…...

重构改善既有代码的设计-学习(三):重新组织数据

1、拆分变量&#xff08;Split Variable&#xff09; 有些变量用于保存一段冗长代码的运算结果&#xff0c;以便稍后使用。这种变量应该只被赋值一次。 如果它们被赋值超过一次&#xff0c;就意味它们在函数中承担了一个以上的责任。如果变量承担多个责任&#xff0c;它就应该被…...

群狼调研(长沙品牌忠诚度测试)|广告效果测评方法

广告效果测评方法可以根据具体的目标和需求而有所差异&#xff0c;以下是一些常见的广告效果测评方法&#xff1a; 1.品牌调研和调查&#xff1a;通过定量或定性的调研和调查方法&#xff0c;评估广告对品牌认知、品牌形象和品牌偏好的影响&#xff0c;包括品牌知名度、品牌关联…...

Gradle学习笔记:Gradle的使用方法

文章目录 1.初始化项目2.构建脚本语言选择3.项目命名4.项目构建过程 1.初始化项目 创建一个test空文件夹&#xff0c;在该文件夹下打开终端&#xff0c;并执行命令&#xff1a;gradle init. 会有一个选项让你选择项目的类型。下面是每个选项的含义和用途&#xff1a; basic&am…...

少儿编程 2023年12月电子学会图形化编程等级考试Scratch二级真题解析(选择题)

2023年12月scratch编程等级考试二级真题 选择题(共25题,每题2分,共50分) 1、在制作推箱子游戏时,地图是用数字形式储存在电脑里的,下图是一个推箱子地图,地图表示如下:第一行( 111111)第二行( 132231) 第三行( 126621) 第四行( ) 第五行( 152321) 第六行( 111111 ) 根…...

基于Java+SpringMvc+vue+element实现上海汽车博物馆平台

基于JavaSpringMvcvueelement实现上海汽车博物馆平台 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 …...

Sybase PowerDesigner15安装配置

1&#xff0c;软件介绍 ​ Power Designer 是Sybase公司的CASE工具集&#xff0c;使用它可以方便地对管理信息系统进行分析设计&#xff0c;他几乎包括了数据库模型设计的全过程。利用Power Designer可以制作数据流程图、概念数据模型、物理数据模型&#xff0c;还可以为数据仓…...

基于物联网设计的水稻田智能灌溉系统(STM32+华为云IOT)

一、项目介绍 随着科技的不断发展和人们生活水平的提高&#xff0c;农业生产也逐渐向智能化、高效化的方向发展。水稻作为我国主要的粮食作物之一&#xff0c;其生长过程中的灌溉管理尤为重要。传统的灌溉方式往往依赖于人工观察和控制&#xff0c;不仅效率低下&#xff0c;而…...

【数据结构】数据结构初识

前言&#xff1a; 数据结构是计算存储&#xff0c;组织数据的方式。数据结构是指相互间存在一种或多种特定关系的数据元素的集合。通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 Data Structure Vi…...

java多线程测试websocket demo(使用文件流)

这个demo主要是利用Java多线程来测试WebSocket通信。首先&#xff0c;创建一个WebSocket服务器和客户端&#xff0c;然后使用多线程来模拟多个客户端同时连接服务器进行通信。通过多线程测试&#xff0c;可以验证WebSocket通信的并发性能和稳定性。同时&#xff0c;可以通过多线…...

Tosei 自助网络店铺管理系统network_test.php_RCE漏洞复现

简介 Tosei 自助洗衣机是日本一家公司的产品,在 network_test.php 文件存在命令执行 漏洞复现 FOFA语法: body="tosei_login_check.php" 主要是日本 访问界面如下所示: 验证POC: /cgi-bin/network_test.php 拼接访问url: https://ip:port/cgi-bin/network_tes…...

uni-app 国际化

vue i18n v9的迁移后的$t()无法获取数组、对象 http://t.csdnimg.cn/WkCHy api:vue i18n [intlify] Not found ‘language’ key in ‘zh-Hans’ locale messages. [intlify] Fall back to translate ‘language’ key with ‘zh’ locale. [intlify] Not found ‘languag…...

git:git reset 和 git revert

在使用 git 进行项目开发的过程中&#xff0c;有时会出现错误提交的情况&#xff0c;这时就需要能够撤销错误的提交&#xff0c;将代码恢复到提交之前的样子。根据不同情况&#xff0c;可以使用 git reset 或 git revert 命令。 一. git reset git reset 的原理是修改 HEAD 的…...

LeetCode:670. 最大交换(Java 贪心)

目录 670. 最大交换 题目描述&#xff1a; 实现代码与解析&#xff1b; 贪心 原理思路&#xff1a; 670. 最大交换 题目描述&#xff1a; 给定一个非负整数&#xff0c;你至多可以交换一次数字中的任意两位。返回你能得到的最大值。 示例 1 : 输入: 2736 输出: 7236 解释…...

【STM32】STM32学习笔记-Unix时间戳(41)

00. 目录 文章目录 00. 目录01. Unix时间戳02. UTC/GMT03. 时间戳转换04. C 标准库 <time.h>05. 时间相关函数示例5.1 time函数5.2 gmtime函数5.3 localtime函数5.4 mktime函数5.5 ctime函数5.6 asctime函数5.7 strftime函数 06. 预留07. 附录 01. Unix时间戳 •Unix 时…...

2016年认证杯SPSSPRO杯数学建模B题(第一阶段)低分辨率下看世界全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 B题 低分辨率下看世界 原题再现&#xff1a; 数码摄像技术被广泛使用于多种场合中。有时由于客观条件的限制&#xff0c;拍摄设备只能在较低的分辨率下成像。为简单起见&#xff0c;我们只考虑单色成像。假设成像的分辨率为 32 64&#xff0c…...

16、Kafka ------ SpringBoot 整合 Kafka (配置 Kafka 属性 及对应的 属性处理类 解析)

目录 配置 Kafka 及对应的 属性处理类配置KafkaKafka配置属性的约定代码演示生产者相关的配置消费者相关的配置 代码&#xff08;配置文件&#xff09;application.properties 配置 Kafka 及对应的 属性处理类 配置Kafka spring.kafka.* 开头的配置属性&#xff0c;这些属性将由…...

【蓝桥杯选拔赛真题61】python偶数平方 第十五届青少年组蓝桥杯python 选拔赛比赛真题解析

目录 python偶数平方 一、题目要求 1、编程实现 2、输入输出...

智能语音识别源码系统+语义理解+对话管理+语音合成 带完整的搭建教程

人工智能技术的不断发展&#xff0c;智能语音识别技术逐渐成为人们日常生活和工作中不可或缺的一部分。然而&#xff0c;目前市场上的智能语音识别产品大多存在一定的局限性&#xff0c;如识别率不高、功能单一等。为了解决这些问题&#xff0c;罗峰给大家分享一款基于智能语音…...

做网站最便宜/迅雷下载磁力天堂

static的作用是将类的成员修饰成静态的&#xff0c;所谓的静态类成员就是指类的成员为类级别的&#xff0c;不需要实例化对象就可以使用&#xff0c;而且类的所有对象都共享同一个静态类成员&#xff0c;因为类静态成员是属于类而不是对象。 #include <iostream> using …...

为歌手做的个人网站/网站推广和宣传的方法

http://wengyuli.blog.51cto.com/44136/583891 完善Demo 在上一篇 WCF服务重构实录&#xff08;上&#xff09;中&#xff0c;我们建立了项目&#xff0c;这里再建立一个简单的客户端调用WCF服务来测试&#xff0c;很简单 这样一个完成的Demo就完成了&#xff0c;那么怎么将…...

wordpress 在线编辑/西安网是科技发展有限公司

分享一个自己电路中的 单键开关机电路&#xff0c;需要与单片机的I/O配合&#xff0c;可实现手机电源键功能&#xff0c;如长按开机、长按关机、轻触开关锁屏或其他自定义功能。并且静态功耗极低&#xff0c;最大uA级&#xff0c;非常适合电池供电。电路需求电路需要使用&#…...

武汉科技公司排名/东莞优化网站关键词优化

:2014年继续教育心得体会,我认真参加了教师继续教育,学习了《中小学教师信息技术与学科教学融合》、《师者之魂》、《教师积极心理健康的培,较好的完成了本年度的继续教育学习任务,教师专业是动态发展的、终身持续的过程,现代教学应是建立在教师学习基础上的,必须在加强和发展教…...

网站优化怎么做分录/网站优化

v-cloak、v-text和v-html的基本区别v-text和插值表达式的区别v-cloak&#xff1a;用来消除插值表达式的闪烁问题v-html和v-text、插值表达式的区别v-text和插值表达式的区别 在使用v-text"msg"时&#xff0c;v-text中的内容msg会直接取代标签中的原有内容。 而使用插…...

网站模板加盟代理/全国各城市感染高峰进度查询

1086.花生米&#xff08;五&#xff09; 时限&#xff1a;1000ms 内存限制&#xff1a;10000K 总时限&#xff1a;3000ms 描述 五一长假第六天&#xff0c;Tom在QQ上遇到了Kitty。呵呵&#xff0c;Kitty&#xff0c;在离散数学课上认识的PPMM……等等&#xff01;Tom恍然大…...