使用Java和FFmpeg进行视频分割的步骤与命令
ffmpeg 视频切片
- FFmpeg 环境变量配置
- win10
- win7/winXP
- FFmpeg 初学之视频切片
- 如果不是mp4的,可以用如下命令进行转换
- 查看视频编码格式
- 转换视频编码格式 [音视频编码为h264/aac]
- 将mp4文件转为ts文件并生成m3u8
- 方案一:先生成.ts文件,再将ts切片,生成.m3u8文件
- 1. 将mp4转为完整的ts
- 2.将ts切片,并生成m3u8文件
- 方案二:直接生成.m3u8文件
- 文件下载
FFmpeg 环境变量配置
win10
环境变量 >> Path >> 新添加 “C:\FFmpeg\ffmpeg-20181215-011c911-win64-static\bin”(引号里面的内容)
win7/winXP
环境变量 >> Path >> 新添加 “;C:\FFmpeg\ffmpeg-20181215-011c911-win64-static\bin;”(引号里面的内容)
FFmpeg 初学之视频切片
如果不是mp4的,可以用如下命令进行转换
ffmpeg -i 输入视频源路径 -acodec copy -vcodec copy 输出视频源路径
ffmpeg -i input.mkv -acodec copy -vcodec copy out.mp4
查看视频编码格式
ffprobe 输入视频源路径
ffprobe C:\Users\Administrator\Desktop\ffmpeg\03-01.mp4
转换视频编码格式 [音视频编码为h264/aac]
ffmpeg -i 输入视频源路径 -acodec libfaac -vcodec libx264 输出视频源路径
ffmpeg -i C:\Users\Administrator\Desktop\ffmpeg\03-01.mp4 -acodec libfaac -vcodec libx264 C:\Users\Administrator\Desktop\ffmpeg\03-01-tar.mp4
ffprobe C:\Users\Administrator\Desktop\ffmpeg\03-01-tar.mp4
ffmpeg -i 输入视频源路径 -acodec aac -vcodec libx264 输出视频源路径
ffmpeg -i C:\Users\Administrator\Desktop\ffmpeg\03-01.mp4 -acodec aac -vcodec libx264 C:\Users\Administrator\Desktop\ffmpeg\03-01-tar.mp4
ffprobe C:\Users\Administrator\Desktop\ffmpeg\03-01-tar.mp4
将mp4文件转为ts文件并生成m3u8
方案一:先生成.ts文件,再将ts切片,生成.m3u8文件
1. 将mp4转为完整的ts
ffmpeg -i 输入视频源路径 -c copy -bsf h264_mp4toannexb 输出ts视频源路径
ffmpeg -i out.mp4 -c copy -bsf h264_mp4toannexb output.ts
2.将ts切片,并生成m3u8文件
ffmpeg -i 上条命令中ts的路径 -c copy -map 0 -f segment -segment_list ‘video18/movie.m3u8(注释1)’ -segment_time 10(注释4) -segment_list_entry_prefix ‘http://192.168.1.67/video/(注释2)’ ‘video18/file-%03d.ts(注释3)’
=>注释1: 该参数可以为一个指定的路径,用来存放m3u8文件,但是其中文件夹必须存在
=>注释2:该参数是添加在m3u8文件中每个ts片段的网络或者本地绝对路径
=>注释3:该参数可以为一个指定的路径,用来存放ts片段,但其中路径中的文件夹必须都要存在
=>注释4:该参数是指,根据此参数指定的秒数为每个ts片段的时长,由于关键帧原因,可能会有所误差
ffmpeg -i output.ts -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 5 output%03d.ts
其中segment 就是切片,-segment_time表示隔几秒进行切一个文件,上面命令是隔5s,你也可以调整成更大的参数。
方案二:直接生成.m3u8文件
ffmpeg -i file.mp4[输入视频源路径] -f segment -segment_time 10[每个ts片段的时长] -segment_format mpegts -segment_list list_file.m3u8[待生成的.m3u8文件名路径] -c copy -bsf:v h264_mp4toannexb -map 0 output_file-%d.ts[待生成的.ts文件名路径]
ffmpeg -i oriVideo.mp4 -f segment -segment_time 10 -segment_format mpegts -segment_list list_file.m3u8 -c copy -bsf:v h264_mp4toannexb -map 0 output_file-%d.ts
文件下载
链接: link
推荐阅读
-
一种结构设计模式,允许在对象中动态添加新行为。它通过创建一个封装器来实现这一目的,即把对象放入一个装饰器类中,然后把这个装饰器类放入另一个装饰器类中,以此类推,形成一个封装器链。这样,我们就可以在不改变原始对象的情况下动态添加新行为或修改原始行为。 在 Java 中,实现装饰器设计模式的步骤如下: 定义一个接口或抽象类作为被装饰对象的基类。 公共接口 Component { void operation; } } 在本例中,我们定义了一个名为 Component 的接口,该接口包含一个名为 operation 的抽象方法,该方法定义了被装饰对象的基本行为。 定义一个实现基类方法的具体装饰对象。 公共类 ConcreteComponent 实现 Component { public class ConcreteComponent implements Component { @Override public void operation { System.out.println("ConcreteComponent is doing something...") ; } } 定义一个抽象装饰器类,该类继承于基类,并将装饰对象作为一个属性。 公共抽象类装饰器实现组件 { protected Component 组件 public Decorator(Component component) { this.component = component; } } @Override public void operation { component.operation; } } } 在这个示例中,我们定义了一个名为 Decorator 的抽象类,它继承了 Component 接口,并将被装饰对象作为一个属性。在操作方法中,我们调用了被装饰对象上的同名方法。 定义一个具体的装饰器类,继承自抽象装饰器类并实现增强逻辑。 公共类 ConcreteDecoratorA extends Decorator { public ConcreteDecoratorA(Component 组件) { super(component); } } public void operation { super.operation System.out.println("ConcreteDecoratorA 正在添加新行为......") ; } } 在本例中,我们定义了一个名为 ConcreteDecoratorA 的具体装饰器类,它继承自装饰器抽象类,并实现了操作方法的增强逻辑。在操作方法中,我们首先调用被装饰对象上的同名方法,然后添加新行为。 使用装饰器增强被装饰对象。 公共类 Main { public static void main(String args) { Component 组件 = new ConcreteComponent; component = new ConcreteDecoratorA(component); 组件操作 } } 在这个示例中,我们首先创建了一个被装饰对象 ConcreteComponent,然后通过 ConcreteDecoratorA 类创建了一个装饰器,并将被装饰对象作为参数传递。最后,调用装饰器的操作方法,实现对被装饰对象的增强。 使用场景 在 Java 中,装饰器模式被广泛使用,尤其是在 I/O 中。Java 中的 I/O 库使用装饰器模式实现了不同数据流之间的转换和增强。 让我们打开文件 a.txt,从中读取数据。InputStream 是一个抽象类,FileInputStream 是专门用于读取文件流的子类。BufferedInputStream 是一个支持缓存的数据读取类,可以提高数据读取的效率,具体代码如下: @Test public void testIO throws Exception { InputStream inputStream = new FileInputStream("C:/bbb/a.txt"); // 实现包装 inputStream = new BufferedInputStream(inputStream); byte bytes = new byte[1024]; int len; while((len = inputStream.read(bytes)) != -1){ System.out.println(new String(bytes, 0, len)); } } } } 其中 BufferedInputStream 对读取数据进行了增强。 这样看来,装饰器设计模式和代理模式似乎有点相似,接下来让我们讨论一下它们之间的区别。 第三,与代理模式的区别: 代理模式的目的是控制对对象的访问,它在对象外部提供一个代理对象来控制对原对象的访问。代理对象和原始对象通常实现相同的接口或继承相同的类,以确保两者可以相互替换。 装饰器模式的目的是动态增强对象的功能,而这是通过对象内部的包装器来实现的。在装饰器模式中,装饰器类和被装饰对象通常实现相同的接口或继承自相同的类,以确保两者可以相互替代。装饰器模式也被称为封装器模式。 在代理模式中,代理类附加了与原类无关的功能。
-
[姿势估计] 实践记录:使用 Dlib 和 mediapipe 进行人脸姿势估计 - 本文重点介绍方法 2):方法 1:基于深度学习的方法:。 基于深度学习的方法:基于深度学习的方法利用深度学习模型,如卷积神经网络(CNN)或递归神经网络(RNN),直接从人脸图像中学习姿势估计。这些方法能够学习更复杂的特征表征,并在大规模数据集上取得优异的性能。方法二:基于二维校准信息估计三维姿态信息(计算机视觉 PnP 问题)。 特征点定位:人脸姿态估计的第一步是通过特征点定位来检测和定位人脸的关键点,如眼睛、鼻子和嘴巴。这些关键点提供了人脸的局部结构信息,可用于后续的姿势估计。 旋转表示:常见的旋转表示方法包括欧拉角和旋转矩阵。欧拉角通过三个旋转角度(通常是俯仰、偏航和滚动)描述头部的旋转姿态。旋转矩阵是一个 3x3 矩阵,表示头部从一个坐标系到另一个坐标系的变换。 三维模型重建:根据特征点的定位结果,三维人脸模型可用于姿势估计。通过将人脸的二维图像映射到三维模型上,可以估算出人脸的旋转和平移信息。这就需要建立人脸的三维模型,然后通过优化方法将模型与特征点对齐,从而获得姿势估计结果。 特征点定位 特征点定位是用于检测人脸关键部位的五官基础部分,还有其他更多的特征点表示方法,大家可以参考我上一篇文章中介绍的特征点检测方案实践:人脸校正二次定位操作来解决人脸校正的问题,客户在检测关键点的代码上略有修改,坐标转换部分客户见上图 def get_face_info(image). img_copy = image.copy image.flags.writeable = False image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = face_detection.process(image) # 在图像上绘制人脸检测注释。 image.flags.writeable = True image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) box_info, facial = None, None if results.detections: for detection in results. for detection in results.detections: mp_drawing.Drawing.detection = 无 mp_drawing.draw_detection(image, detection) 面部 = detection.location_data.relative_keypoints 返回面部 在上述代码中,返回的数据是五官(6 个关键点的坐标),这是用 mediapipe 库实现的,下面我们可以尝试用另一个库:dlib 来实现。 使用 dlib 使用 Dlib 库在 Python 中实现人脸关键点检测的步骤如下: 确保已安装 Dlib 库,可使用以下命令: pip install dlib 导入必要的库: 加载 Dlib 的人脸检测器和关键点检测器模型: 读取图像并将其灰度化: 使用人脸检测器检测图像中的人脸: 对检测到的人脸进行遍历,并使用关键点检测器检测人脸关键点: 显示绘制了关键点的图像: 以下代码将参数 landmarks_part 添加到要返回的关键点坐标中。
-
使用FFmpeg和NVIDIA GPU进行视频硬件编码与解码的实验探究
-
使用Java和FFmpeg进行视频分割的步骤与命令