就是在Linux上使用OBS Studio录制一个讲座或者其他视频,可能总有些时候会多录制一段时间,但是如果使用剪映或者PR这样的工具在导出的时候总需要烦恼导出的格式和参数,比如剪映就不支持mkv格式的导出,导出成mp4格式的视频就会变得很大,有很方便的处理办法,使用ffmpeg
一. 最终效果
!!!注意!!!:还是有一点我不知道原因的问题,发现新视频虽然可以播放,但是在Linux下总是有前几秒的黑屏,在NAS端的网页播放时也加载的很慢,还是有问题的
处理前:
处理后:
二. 处理代码
2.1 读取视频或者图片信息的代码
import os
import cv2
from PIL import Imagedef 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 infoexcept 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 infoexcept 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("文件不存在!")returnext = 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.VideoCapturetry: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
关键注意事项:
- 保持原画质参数:使用
-c copy
直接复制编码流,分辨率/帧率自动继承 - 时间精度优化:
- 添加
-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
- 添加
- MKV格式兼容性:MKV容器支持流复制,无需转码
验证输出信息
执行后可运行 ffprobe output.mkv
检查输出视频的时长、分辨率、帧率是否与需求一致
注:若裁剪位置不在关键帧,ffmpeg会自动跳到前一关键帧,可能导致头尾有数秒误差。如需帧级精准需重新编码(不推荐,会降低质量)