linux有效裁剪视频的方式(基于ffmpeg,不改变分辨率,帧率,视频质量,不需要三方软件)

news2025/5/31 19:19:16

就是在Linux上使用OBS Studio录制一个讲座或者其他视频,可能总有些时候会多录制一段时间,但是如果使用剪映或者PR这样的工具在导出的时候总需要烦恼导出的格式和参数,比如剪映就不支持mkv格式的导出,导出成mp4格式的视频就会变得很大,有很方便的处理办法,使用ffmpeg

一. 最终效果


!!!注意!!!:还是有一点我不知道原因的问题,发现新视频虽然可以播放,但是在Linux下总是有前几秒的黑屏,在NAS端的网页播放时也加载的很慢,还是有问题的


处理前:
在这里插入图片描述
处理后:
在这里插入图片描述


二. 处理代码

2.1 读取视频或者图片信息的代码

import os
import cv2
from PIL import Image

def get_image_info(image_path):
    try:
        with Image.open(image_path) as img:
            info = {
                "类型": "图片",
                "文件名": os.path.basename(image_path),
                "格式": img.format,
                "模式": img.mode,
                "分辨率": img.size,  # (宽, 高)
                "色深": img.bits if hasattr(img, 'bits') else "未知",
                "通道数": len(img.getbands()),
                "文件大小(字节)": os.path.getsize(image_path)
            }
            return info
    except Exception as e:
        return {"错误": f"无法读取图片信息: {e}"}

def get_video_info(video_path):
    try:
        cap = cv2.VideoCapture(video_path)
        if not cap.isOpened():
            return {"错误": "无法打开视频文件"}
        info = {
            "类型": "视频",
            "文件名": os.path.basename(video_path),
            "分辨率": (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))),
            "帧率(FPS)": cap.get(cv2.CAP_PROP_FPS),
            "总帧数": int(cap.get(cv2.CAP_PROP_FRAME_COUNT)),
            "时长(秒)": cap.get(cv2.CAP_PROP_FRAME_COUNT) / cap.get(cv2.CAP_PROP_FPS) if cap.get(cv2.CAP_PROP_FPS) > 0 else "未知",
            "编码格式": cap.get(cv2.CAP_PROP_FOURCC),
            "文件大小(字节)": os.path.getsize(video_path)
        }
        cap.release()
        return info
    except Exception as e:
        return {"错误": f"无法读取视频信息: {e}"}

def print_info(info):
    for k, v in info.items():
        print(f"{k}: {v}")

def main(file_path):
    if not os.path.isfile(file_path):
        print("文件不存在!")
        return
    ext = os.path.splitext(file_path)[1].lower()
    image_exts = ['.jpg', '.jpeg', '.png', '.bmp', '.tiff', '.gif', '.webp']
    video_exts = ['.mp4', '.avi', '.mov', '.mkv', '.flv', '.wmv', '.webm', '.mpeg', '.mpg']
    if ext in image_exts:
        info = get_image_info(file_path)
    elif ext in video_exts:
        info = get_video_info(file_path)
    else:
        # 尝试用PIL打开,失败再尝试用cv2.VideoCapture
        try:
            with Image.open(file_path) as img:
                info = get_image_info(file_path)
        except Exception:
            info = get_video_info(file_path)
    print_info(info)

if __name__ == "__main__":
    # path = input("请输入图片或视频文件路径:").strip()
    path = "/home/tipriest/output.mkv"
    main(path)
    

2.2 截取视频的代码

ffmpeg -i "深蓝学院-YY硕-访谈.mkv" -ss 00:00:00 -to 02:05:11 -c:v copy -c:a copy output.mkv

三. ffmpeg命令详细说明

要裁剪视频并保持分辨率、帧率不变,可以使用ffmpeg工具实现。具体步骤如下:

方法一:指定结束时间点裁剪(推荐)

ffmpeg -i "深蓝学院-YY硕-访谈.mkv" -ss 00:00:00 -to 01:30:00 -c:v copy -c:a copy output.mkv

参数说明:

  • -to 01:30:00:裁剪到1小时30分钟(按需替换时间)
  • -c:v copy -c:a copy:直接复制音视频编码流,避免重新编码
  • 支持精确到毫秒的格式:00:10:30.500

方法二:指定持续时间裁剪

ffmpeg -i input.mkv -t 5400 -c copy output.mkv

参数说明:

  • -t 5400:保留前5400秒(即1.5小时)
  • 总时长10631秒≈2小时57分,若需保留前2小时则 -t 7200

关键注意事项:

  1. 保持原画质参数:使用 -c copy 直接复制编码流,分辨率/帧率自动继承
  2. 时间精度优化
    • 添加 -avoid_negative_ts 1 防止时间戳错误
    • 添加 -copyts 保留原始时间戳
    ffmpeg -ss 00:09:50 -i input.mkv -ss 00:10:00 -to 00:20:00 -copyts -c copy -avoid_negative_ts 1 output.mkv
    
  3. MKV格式兼容性:MKV容器支持流复制,无需转码

验证输出信息

执行后可运行 ffprobe output.mkv 检查输出视频的时长、分辨率、帧率是否与需求一致

注:若裁剪位置不在关键帧,ffmpeg会自动跳到前一关键帧,可能导致头尾有数秒误差。如需帧级精准需重新编码(不推荐,会降低质量)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2391692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器密码安全运维解决新思路:凭据管理SMS+双因素SLA认证结合的方案

引言:云服务器安全成本困局 在云计算渗透率突破60%的今天,中小企业正面临严峻的安全悖论:某权威机构数据显示,72%的云上数据泄露事件源于凭据管理不当,而传统安全解决方案的采购成本往往超过中小企业年利润的8%。这种…

论文阅读笔记——In-Context Edit

ICEdit 论文阅读笔记 指令图像编辑现有方法的局限: 微调类方法(InstructPix2Pix、Emu Edit、 Ultra Edit):需要大规模数据和算力、精度高但效率低且泛化性低;免训练方法(Prompt-to-Prompt、 StableFlow&am…

【后端高阶面经:MongoDB篇】41、MongoDB 是怎么做到高可用的?

一、MongoDB高可用核心架构:副本集(Replica Set)设计 (一)副本集角色与拓扑结构 1. 三大核心角色 角色职责描述资源占用选举权重数据存储Primary唯一接收写请求的节点,将操作日志(Oplog&…

DMBOK对比知识点整理(4)

1.常见数据质量维度 常见数据质量维度(DMBOK-P353)质量维度

day12 leetcode-hot100-21(矩阵4)

240. 搜索二维矩阵 II - 力扣(LeetCode) 1.暴力法O(m*n) 思路:两层for循环即可。 2.二分查找O(m*logn) 思路:每行都用二分查找,因为每行都是排好序的 class Solution {public boolean searchMatrix(int[][] matrix, int targe…

提问:鲜羊奶是解决育儿Bug的补丁吗?

在育儿这个"系统工程"中,过度提醒就像冗余代码:"快写作业"(重复调用)、"多穿衣服"(异常捕获)、"别玩手机"(进程阻断)。羊大师技术育儿实验…

关于数据仓库、数据湖、数据平台、数据中台和湖仓一体的概念和区别

我们谈论数据中台之前, 我们也听到过数据平台、数据仓库、数据湖、湖仓一体的相关概念,它们都与数据有关系,但他们和数据中台有什么样的区别, 下面我们将围绕数据平台、数据仓库、数据湖和数据中台的区别进行介绍。 一、相关概念…

什么是可重组机器人?

可重组机器人是一种具有高度灵活性和适应性的新型机器人系统,能够根据不同任务需求,快速改变自身结构和功能。下面我从概念、结构、特点、应用领域、发展趋势等方面,为你详细介绍: 概念:可重组机器人是由多个标准化、模…

4、docker compose

1、介绍 Docker Compose 是 Docker 官方提供的容器编排工具,用于简化多容器应用的开发、部署和管理。它通过声明式配置文件(YAML格式)定义容器化应用的服务、网络、存储等组件及其依赖关系,使用户能够通过单一命令快速启动、停止…

SQL里几种JOIN连接

数据信息: 员工表EMP 部门表DEPT 一、INNER JOIN(内连接) 作用:只返回两个表中完全匹配的行,相当于取交集。 场景:查询「有部门的员工信息」。 示例: SELECT 员工.姓名, 部门.部门名称 FR…

基于通义千问的儿童陪伴学习和成长的智能应用架构。

1.整体架构概览 我们的儿童聊天助手将采用典型的语音交互系统架构,结合大模型能力和外部知识库: 2. 技术方案分解 2.1. 前端应用/设备 选择: 移动App(iOS/Android)、Web应用,或者集成到智能音箱/平板等硬件设备中。技术栈: 移动App: React Native / Flutter (跨平台…

LVS-DR 负载均衡群集

目录 一、LVS-DR集群 1、LVS-DR 工作原理 2、数据包流向分析 3、LVS-DR 模式特点 二、直接路由模式(LVS-DR) 1、准备案例环境 2、配置负载调度器(101) (1)配置虚拟IP 地址(VIP&#xff…

[Dify] 如何应对明道云API数据过长带来的Token超限问题

在集成明道云与大型语言模型(LLM)如ChatGPT或本地部署的Dify时,开发者经常会面临一个核心问题:API获取的数据太长,超出LLM支持的Token数限制,导致无法直接处理。本文将深入探讨这个问题的成因,并提供几种可行的解决方案,包括分段处理、外部知识库构建等策略。 明道云AP…

eNSP企业综合网络设计拓扑图

1.拓扑图 2.拓扑配置 此拓扑还有一些瑕疵,仅做参考和技术提升使用。 想要配置的可以关注下载 大型网络综合实验拓扑图(eNSP)资源-CSDN文库

BugKu Web渗透之备份是个好习惯

启动场景后,网页显示一段字符串。 看起来像md5值,但是又过长了。 步骤一:右键查看源代码,没有发现任何异常。 步骤二:使用dirsearch去查看是否有其他可疑文件。 在终端输入: dirsearch -u http://117.72.…

华为AP6050DN无线接入点瘦模式转胖模式

引言 华为AP6050DN是一款企业级商用的无线接入点。由于产品定位原因,其默认工作在瘦模式下,即须经AC统一控制和管理,是不能直接充当普通的无线路由器来使用的。 而本文的目的,就是让其能脱离AC的统一控制和管理,当作普通无线路由器来使用。 硬件准备 华为AP6050DN无线接…

十、【核心功能篇】项目与模块管理:前端页面开发与后端 API 联调实战

【核心功能篇】项目与模块管理:前端页面开发与后端 API 联调实战 前言准备工作第一部分:完善项目管理功能 (Project)1. 创建/编辑项目的表单对话框组件 第二部分:模块管理功能 (集成到项目详情页)1. 创建模块相关的 API 服务 (src/api/module…

【大模型/MCP】MCP简介

一句话总结 如果你打算让 LLM 像人一样“随手”调用脚本、数据库、搜索引擎或 CI/CD 流水线,而又不想为每个工具分别写 REST 插件或轮询接口,那么把它们包进 MCP 服务器是当前最省心、延迟最低、可复用最高的做法——正因如此 OpenAI、Google DeepMind、…

[Godot][游戏开发] 如何在 Godot 中配置 Android 环境(适配新版 Android Studio)

在使用 Godot 进行 Android 项目的开发与导出时,配置 Android 环境是一项必要步骤。随着 Android Studio 的更新(特别是自 Arctic Fox 版本起),安装方式发生了变化,默认不再引导用户手动配置 SDK/JDK/NDK,而…

机器学习多分类逻辑回归和二分类神经网络实践

1、2-17 实现多分类逻辑回归 代码 # 2-17 实现多分类逻辑回归 import pandas as pd import numpy as np import matplotlib.pyplot as plt# 参数设置 iterations 5400 # 迭代次数 learning_rate 0.1 # 学习率 m_train 200 # 训练样本数量# 整数索引值转one-hot向量 def…