就是在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會自動跳到前一關鍵幀,可能導致頭尾有數秒誤差。如需幀級精準需重新編碼(不推薦,會降低質量)