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

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

一. 最终效果


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


处理前:

处理后:


二. 处理代码

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

python3 复制代码
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 截取视频的代码

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

三. ffmpeg命令详细说明

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

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

bash 复制代码
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

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

bash 复制代码
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 保留原始时间戳
    bash 复制代码
    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会自动跳到前一关键帧,可能导致头尾有数秒误差。如需帧级精准需重新编码(不推荐,会降低质量)

相关推荐
ldj20204 分钟前
2025 Centos 安装PostgreSQL
linux·postgresql·centos
翻滚吧键盘10 分钟前
opensuse tumbleweed上安装显卡驱动
linux
cui_win1 小时前
【内存】Linux 内核优化实战 - net.ipv4.tcp_tw_reuse
linux·网络·tcp/ip
CodeWithMe4 小时前
【Note】《深入理解Linux内核》 Chapter 15 :深入理解 Linux 页缓存
linux·spring·缓存
0wioiw04 小时前
Ubuntu基础(监控重启和查找程序)
linux·服务器·ubuntu
Tipriest_4 小时前
Ubuntu常用的软件格式deb, rpm, dmg, AppImage等打包及使用方法
linux·运维·ubuntu
胡斌附体5 小时前
linux测试端口是否可被外部访问
linux·运维·服务器·python·测试·端口测试·临时服务器
愚润求学5 小时前
【Linux】自旋锁和读写锁
linux·运维
大锦终5 小时前
【Linux】常用基本指令
linux·运维·服务器·centos
IT项目管理6 小时前
达梦数据库DMHS介绍及安装部署
linux·数据库