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

短视频利器 ffmpeg (2)

ffmpeg 官网这样写到

Converting video and audio has never been so easy.

如何轻松简单的使用:

1、下载

官网:http://www.ffmpeg.org

安装参考文档:
https://blog.csdn.net/qq_36765018/article/details/139067654

2、安装

# 启用RPM Fusion仓库。你可以选择免费或非免费仓库。对于ffmpeg,你通常需要免费仓库。
sudo yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm# 启用仓库后,你可以安装ffmpeg:
sudo yum install ffmpeg#通过检查ffmpeg版本来验证安装:
ffmpeg -versionffmpeg version 3.4.13 Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-44)libavutil      55. 78.100 / 55. 78.100
libavcodec     57.107.100 / 57.107.100
libavformat    57. 83.100 / 57. 83.100
libavdevice    57. 10.100 / 57. 10.100
libavfilter     6.107.100 /  6.107.100
libavresample   3.  7.  0 /  3.  7.  0
libswscale      4.  8.100 /  4.  8.100
libswresample   2.  9.100 /  2.  9.100
libpostproc    54.  7.100 / 54.  7.100#如果在使用RPM Fusion仓库时遇到任何问题,你可以尝试使用--enablerepo选项来显式指定仓库:
#sudo yum --enablerepo=rpmfusion-free install ffmpeg

3、使用场景

3.1 视频格式转换

手机主流视频格式:
"mp4", "avi", "rmvb",
苹果手机默认是 mov : (需要把这种格式进行格式转换)# 格式转换,先转为mp4 然后再进行处理仅将其流式传输到Adobe Premiere Pro 等一些应用程序所需的新容器(mp4)而不编码 (fast)的命令为
ffmpeg -i input.mov -qscale 0 output.mp4注释中提到的替代,它以最佳质量(-qscale 0)重新编码
ffmpeg -i fengj.mov -q:v 0 fengj.mp4

3.2、视频切图片(缺点是文件有点大,比原视频还大)

从视频文件或gif图片中逐帧提取图片,并加上编号。(很有意思,这里演示视频格式,gif图片你可以试下。)
ffmpeg -i video.mp4 frame_%d.png4、提取视频文件指定时间点的1帧,下面演示的是提取第2秒的1帧。
ffmpeg -ss 00:02 -i fengj.mp4 -frames 1  -f image2 fengj0002.png

3.3、给视频加文字水印,颜色为红色,水印内容为LinuxTime。水印位置对应命令中的x轴和y轴。(待验证)

ffmpeg -hwaccel cuvid -i fengj1.mp4 -c:v libx264 -c:a copy  -vf "drawtext=fontfile=zh.ttf:text='LinuxTime':x=1200:y=900:fontsize=50:fontcolor=red:shadowy=2" fengj2.mp4

3.4、视频切片

ffmpeg -y -i shouye_202462117216.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb video_xiongmao/shouye.tsffmpeg -i video_xiongmao/shouye.ts -c copy -map 0 -f segment -segment_list video_xiongmao/shouye.m3u8 -segment_time 1 video_xiongmao/shouye-%04d.ts

4、shell 脚本编写

如需要使用 java 或者其他语言调用 这个软件,执行相关命令,则可以编写如下脚本。方便调用

4.1、视频文件转ts容器,根据不同的视频编码,确定使用不同的 比特流过滤器

#!/bin/bash# chmod +x convert_mp4_to_ts.sh
# 检查是否提供了两个参数
if [ "$#" -ne 2 ]; thenecho "Usage: $0 input.mp4 output.ts"exit 1
fi# 获取输入和输出文件名
input_file="$1"
output_file="$2"# 期待的视频编码
expected_codec="h264"# 使用ffprobe获取视频编码
actual_codec=$(ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "$input_file")# 检查编码类型
if [ "$actual_codec" = "$expected_codec" ]; thenecho "The video is encoded with H.264."# 使用ffmpeg转换视频:将MP4文件转换为TS格式ffmpeg -y -i "$input_file" -vcodec copy -acodec copy -vbsf h264_mp4toannexb "$output_file"
elseecho "The video is NOT encoded with H.264. It is encoded with $actual_codec."ffmpeg -y -i "$input_file" -c:v libx264 -preset veryfast -crf 23 -c:a aac -b:a 128k -movflags +faststart "$output_file"
fi# 检查ffmpeg执行结果
if [ $? -eq 0 ]; thenecho "Video conversion successful."
elseecho "Video conversion failed. Check the logs for more information."
fi

4.2、将ts 容器进行切片

#!/bin/bash# 文件可执行 chmod +x convert_video.sh
# 检查是否提供了三个参数
if [ "$#" -ne 3 ]; thenecho "Usage: $0 input.ts output.m3u8 output.ts"exit 1
fi# 获取输入和输出文件名
input_file="$1"
m3u8_file="$2"
output_file="$3"# 使用ffmpeg转换视频: 将 ts 文件进行切片,并输出为 m3u8 文件和 切片文件
ffmpeg -y -i "$input_file" -c copy -map 0 -f segment -segment_list "$m3u8_file" -segment_time 1 "$output_file"# 检查ffmpeg执行结果
if [ $? -eq 0 ]; thenecho "Video conversion successful."
elseecho "Video conversion failed. Check the logs for more information."
fi

5、java 中如何调用

  public static void main(String[] args) {executeCommandForScript(Arrays.asList("sh", "/xxxx.sh", "sourceFile", "outputFile"));}public static void executeCommandForScript(List<String> command) {// 使用ProcessBuilder执行命令try {log.info("---------->>>>command:{}", StringUtils.join(command, " "));ProcessBuilder pb = new ProcessBuilder(command);Process process = pb.start();// 获取并打印命令的输出//Thread stdoutThread = readStream(process.getInputStream(), "OUTPUT");//Thread stderrThread = readStream(process.getErrorStream(), "ERROR");//stdoutThread.start();//stderrThread.start();// 等待命令执行完成int exitCode = process.waitFor();if (exitCode == 0) {log.info("Video conversion completed successfully.");} else {log.error("Video conversion failed with exit code: " + exitCode);}// 确保读取线程完成//stdoutThread.join();//stderrThread.join();} catch (IOException | InterruptedException e) {e.printStackTrace();}}

6、HTML验证

比如使用了 4.1和4.2 的脚本进行切片处理后,如何使用

可以来一个简单的 nginx配置,

    # 视频调试location  / {root  /home/minio/data/xxx/video_test;try_files $uri $uri/ /index.html;index  index.html index.htm;proxy_set_header   X-Real-IP         $remote_addr;proxy_set_header   Host              $http_host;proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;error_page 405 =200 @405;}

编写一个简单的index.html 文件

<!DOCTYPE html>
<html>
<head> 
<meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="Access-Control-Allow-Origin" content="*"><title>H5播放m3u8文件</title><!-- <script src="https://cdn.jsdelivr.net/hls.js/latest/hls.min.js"></script> --><script src="hls.min.js"></script><style>.centered-video-container {display: flex;justify-content: center;align-items: center;height: 100vh; /* Full height of the viewport */}video {max-width: 100%; /* To prevent the video from overflowing the container */}
</style>
</head>
<body>
<div class="centered-video-container"><video id="video"  controls>Your browser does not support the video tag.</video>
</div>
</body>
<script>var m3u8FilePath = "20240627151016AA001.m3u8";if (Hls.isSupported()) {var video = document.getElementById('video');// video.play();var hls = new Hls();hls.loadSource(m3u8FilePath);hls.attachMedia(video);hls.on(Hls.Events.MANIFEST_PARSED, function() {video.play();});} else if (video.canPlayType('application/vnd.apple.mpegURL')) {video.src = m3u8FilePath;video.addEventListener('loadedmetadata', function() {video.play();});}
</script>
</html>

小结:

使用 ffmpeg 做为视频切片工具,非常方便,有很多点值得探索,本文主要分享了, ffmpeg如果下载 ,安装,使用。并编写通用可执行shell 脚本,方便程序语言 在对用户上传的视频文件进行切片调用。

其中 m3u8 文件,记录了一个播放文件的顺序列表。方便在网络低带宽的情况下,依然可以满足用户观看视频的需求。

其他文章

ffmpeg命令中文手册-腾讯云开发者社区-腾讯云

ffmpeg命令中文手册-腾讯云开发者社区-腾讯云

相关文章:

短视频利器 ffmpeg (2)

ffmpeg 官网这样写到 Converting video and audio has never been so easy. 如何轻松简单的使用&#xff1a; 1、下载 官网&#xff1a;http://www.ffmpeg.org 安装参考文档&#xff1a; https://blog.csdn.net/qq_36765018/article/details/139067654 2、安装 # 启用RPM …...

【计算机毕业设计】基于Springboot的智能物流管理系统【源码+lw+部署文档】

包含论文源码的压缩包较大&#xff0c;请私信或者加我的绿色小软件获取 免责声明&#xff1a;资料部分来源于合法的互联网渠道收集和整理&#xff0c;部分自己学习积累成果&#xff0c;供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…...

【2024】LeetCode HOT 100——图论

目录 1. 岛屿数量1.1 C++实现1.2 Python实现1.3 时空分析2. 腐烂的橘子2.1 C++实现2.2 Python实现2.3 时空分析3. 课程表3.1 C++实现3.2 Python实现3.3 时空分析4. 实现 Trie (前缀树)4.1 C++实现4.2 Python实现4.3 时空分析1. 岛屿数量 🔗 原题链接:200. 岛屿数量 经典的Fl…...

解析Java中1000个常用类:Currency类,你学会了吗?

在线工具站 推荐一个程序员在线工具站:程序员常用工具(http://cxytools.com),有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具,效率加倍嘎嘎好用。程序员资料站 推荐一个程序员编程资料站:程序员的成长之路(http://cxyroad.com),收录了一些列的技术教程…...

5.x86游戏实战-CE定位基地址

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;4.x86游戏实战-人物状态标志位 上一个内容通过CE未知的初始值、未变动的数值、…...

istitle()方法——判断首字母是否大写其他字母小写

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 istitle()方法用于判断字符串中所有的单词首字母是否为大写而其他字母为小写。istitle()方法的语法格式如下&#xff1a; str.istitle() …...

Linux实用命令练习

目录 一、常用命令 二、系统命令 三、用户和组 四、权限 五、文件相关命令 六、查找 七、正则表达式 八、输入输出重定向 九、进程控制 十、其他命令 1、远程文件复制&#xff1a;scp 2、locate查找 3、which命令 4、设置或显示环境变量&#xff1a;export 5、修…...

刷题——二叉搜索树与双向链表

二叉搜索树与双向链表_牛客题霸_牛客网 方法一&#xff1a; void dfs(TreeNode* pRootOfTree, TreeNode* &pre){if(pRootOfTree NULL)return;dfs(pRootOfTree->left, pre);//所有左子树if(pre)pre->right pRootOfTree;pRootOfTree->left pre;pre pRootOfTree…...

【Linux】进程优先级 | 环境变量

目录 Ⅰ. 进程优先级&#xff08;Process Priority&#xff09; 1. 什么是进程优先级&#xff1f; 2. 查看系统进程 3. 修改进程优先级 4.优先级调度原理 Ⅱ. 进程的切换&#xff08;Process Switch&#xff09; 1. 竞争与独立 2. 并行与并发 3. 进程抢占 4.实现切换…...

最新手动迁移WordPress方法

手动迁移WordPress网站主要步骤有&#xff1a;迁移文件、迁移数据库、修复数据库连接。 对于WordPress Installations&#xff0c;只有两个主要组件&#xff0c;您需要访问手动将安装迁移到新主机&#xff1a;文件和数据库。 迁移文件 将文件从旧主机迁移到新的最简单方法之…...

ChatGPT在程序开发中的应用:提升生产力的秘密武器

在当今飞速发展的科技时代&#xff0c;程序开发已经成为许多企业和个人必不可少的技能。然而&#xff0c;编写代码并非总是顺风顺水&#xff0c;面对复杂的算法、繁琐的调试、持续不断的需求变更&#xff0c;程序员们常常感到压力山大。在这种情况下&#xff0c;ChatGPT应运而生…...

AI与Python共舞:如何利用深度学习优化推荐系统?

AI与Python共舞&#xff1a;如何利用深度学习优化推荐系统&#xff1f; 当你在浏览新闻、电影或是购物平台时&#xff0c;那些仿佛读懂你心思的个性化推荐背后&#xff0c;正是AI技术与Python语言的精妙协作。今天&#xff0c;我们将通过一个实际案例&#xff0c;探索如何利用…...

URLSearchParams: 浏览器中的查询字符串处理利器

一、 概述 在Web开发中&#xff0c;处理URL的查询字符串是一个常见任务。URLSearchParams API 提供了一种简单而强大的方法来处理Web URL的查询参数。它是一个内置的浏览器API&#xff0c;允许你以名称/值对的形式轻松地创建、读取、更新和删除查询参数。 二、URLSearchParam…...

2024最新初级会计职称题库来啦!!!

16.根据增值税法律制度的规定&#xff0c;下列各项中&#xff0c;属于"提供加工、修理修配劳务"的是&#xff08;&#xff09;。 A.修理小汽车 B.修缮办公楼 C.爆破 D.矿山穿孔 答案&#xff1a;A 解析&#xff1a;选项AB&#xff1a;修理有形动产&#xff08;…...

Stirling PDF 部署 - 强大的PDF Web在线编辑工具箱

简介 这是一个强大的、可本地托管的、基于 Web 的 PDF 操作工具&#xff0c;可使用 Docker部署。它使您能够对 PDF 文件执行各种操作&#xff0c;包括拆分、合并、转换、重组、添加图像、旋转、压缩等。这个本地托管的 Web 应用程序已经发展到包含一套全面的功能&#xff0c;可…...

大数据面试题之MapReduce(3)

目录 reduce任务什么时候开始? MapReduce的reduce使用的是什么排序? MapReduce怎么确定MapTask的数量? Map数量由什么决定 MapReduce的map进程和reducer进程的ivm垃圾回收器怎么选择可以提高吞吐量? MapReduce的task数目划分 MapReduce作业执行的过程中&#xff0c;中…...

[leetcode]squares-of-a-sorted-array. 有序数组的平方

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> sortedSquares(vector<int>& nums) {int n nums.size();vector<int> ans(n);for (int i 0, j n - 1, pos n - 1; i < j;) {if (nums[i] * nums[i] > nums[j] *…...

使用Spring Boot和Spring Data JPA进行数据库操作

使用Spring Boot和Spring Data JPA进行数据库操作 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在现代的Web应用开发中&#xff0c;数据库操作是不可或缺的一…...

《昇思25天学习打卡营第17天 | 昇思MindSporeCycleGAN图像风格迁移互换》

17天 本节学习了CycleGAN图像风格迁移互换。 CycleGAN即循环对抗生成网络&#xff0c;该模型实现了一种在没有配对示例的情况下学习将图像从源域 X 转换到目标域 Y 的方法。该模型一个重要应用领域是域迁移&#xff0c;可以通俗地理解为图像风格迁移。其实在 CycleGAN 之前&a…...

SecureCRT使用SSH登录服务器报错:Key exchange failed

SecureCRT使用SSH登录Ubuntu服务器报错&#xff1a;Key exchange failed 原因&#xff1a; ssh客户端与服务器的公钥协商失败&#xff0c;SecureCRT客户端所指定的秘钥交换算法&#xff08;KexAlgorithms &#xff09;&#xff0c;不在服务端支持范围内。可能是服务端的sshd版…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...

[特殊字符] 手撸 Redis 互斥锁那些坑

&#x1f4d6; 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作&#xff0c;想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁&#xff0c;也顺便跟 Redisson 的 RLock 机制对比了下&#xff0c;记录一波&#xff0c;别踩我踩过…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...

OPENCV图形计算面积、弧长API讲解(1)

一.OPENCV图形面积、弧长计算的API介绍 之前我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天我们主要结合轮廓检测的API去计算图形的面积&#xff0c;这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能&#xff0c;常用的API…...

【大厂机试题解法笔记】矩阵匹配

题目 从一个 N * M&#xff08;N ≤ M&#xff09;的矩阵中选出 N 个数&#xff0c;任意两个数字不能在同一行或同一列&#xff0c;求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求&#xff1a;1 ≤ K ≤ N ≤ M ≤ 150 输入格式 N M K N*M矩阵 输…...

Angular中Webpack与ngx-build-plus 浅学

Webpack 在 Angular 中的概念 Webpack 是一个模块打包工具&#xff0c;用于将多个模块和资源打包成一个或多个文件。在 Angular 项目中&#xff0c;Webpack 负责将 TypeScript、HTML、CSS 等文件打包成浏览器可以理解的 JavaScript 文件。Angular CLI 默认使用 Webpack 进行项目…...

CCF 开源发展委员会 “开源高校行“ 暨红山开源 + OpenAtom openKylin 高校行活动在西安四所高校成功举办

点击蓝字 关注我们 CCF Opensource Development Committee CCF开源高校行 暨红山开源 openKylin 高校行 西安站 5 月 26 日至 28 日&#xff0c;CCF 开源发展委员会 "开源高校行" 暨红山开源 OpenAtom openKylin 高校行活动在西安四所高校&#xff08;西安交通大学…...

【基于阿里云搭建数据仓库(离线)】使用UDTF时出现报错“FlatEventUDTF cannot be resolved”

目录 问题&#xff1a; 可能的原因有&#xff1a; 解决方法&#xff1a; 问题&#xff1a; 已经将包含第三方依赖的jar包上传到dataworks&#xff0c;并且成功注册函数&#xff0c;但是还是报错&#xff1a;“FlatEventUDTF cannot be resolved”&#xff0c;如下&#xff1a…...