scikit-video读写视频

本文介绍scikit-video库的使用方法,包括视频的读写操作、视频元信息的获取等,并提供示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

scikit-video是一个python视频处理库,可以方便调用各种视频处理算法

读写视频

skvideo.io是使用FFmpeg/LibAV作为后端的视频读写模块。利用可用的后端,它会用合适的探测工具 (ffprobe, avprobe, or even mediainfo)来解析视频的元数据。

1、读视频

使用skvideo.io.vread来将任意视频数据作为一个单独的ndarry加载入内存(这里是bigbuckbunny视频)。注意,这个函数假定你有足够大的内存,所有尽量使用小的视频。

import skvideo.io
import skvideo.datasets
videodata = skvideo.io.vread(skvideo.datasets.bigbuckbunny())
print(videodata.shape)

运行这段代码会打印输出:

(132, 720, 1280, 3)

使用skvideo.io.vreader可以逐帧加载任意视频(这里是bigbuckbunny视频)。这个函数可以用来加载大文件,而且它通常比把视频加载为一个单独的ndarry要快。但是它需要在加载时处理每一帧。如下代码片段:

import skvideo.io
import skvideo.datasets
videogen = skvideo.io.vreader(skvideo.datasets.bigbuckbunny())
for frame in videogen:
        print(frame.shape)

它的输出为:

(720, 1280, 3)
(720, 1280, 3)
     ...
     ...
     ...
(720, 1280, 3)

有时特定的用例需要微调(fine tuning)FFmpeg的读入参数。你可以使用skvideo.io.FFmpegReader

import skvideo.io
import skvideo.datasets

# here you can set keys and values for parameters in ffmpeg
inputparameters = {}
outputparameters = {}
reader = skvideo.io.FFmpegReader(skvideo.datasets.bigbuckbunny(),
                inputdict=inputparameters,
                outputdict=outputparameters)

# iterate through the frames
accumulation = 0
for frame in reader.nextFrame():
        # do something with the ndarray frame
        accumulation += np.sum(frame)

例如, FFmpegReader默认返回的是RGB类型,但是有时你想使用其他颜色空间,你可以在outputparameters中设置合适的 key/values值。因为FFmpeg输出被导入stdin,你可以在这使用所有的FFmpeg 指令。inputparameters对那些没有头信息的原始视频信号很有用。

2、写视频

将一个ndarry写为视频文件可以使用skvideo.io.write

import skvideo.io
import numpy as np

outputdata = np.random.random(size=(5, 480, 680, 3)) * 255
outputdata = outputdata.astype(np.uint8)

skvideo.io.vwrite("outputvideo.mp4", outputdata)

通常写入视频需要微调 FFmpeg的写入参数以选择编码器、帧率、位率等。你可以使用skvideo.io.FFmpegWriter实现这些。

import skvideo.io
import numpy as np

outputdata = np.random.random(size=(5, 480, 680, 3)) * 255
outputdata = outputdata.astype(np.uint8)

writer = skvideo.io.FFmpegWriter("outputvideo.mp4")
for i in xrange(5):
        writer.writeFrame(outputdata[i, :, :, :])
writer.close()

3、读视频元信息

使用skvideo.io.ffprobe读取视频元信息。如下所示:

import skvideo.io
import skvideo.datasets
import json
metadata = skvideo.io.ffprobe(skvideo.datasets.bigbuckbunny())
print(metadata.keys())
print(json.dumps(metadata["video"], indent=4))

skvideo.io.ffprobe返回一个字典,可以把它传入json.dumps来更好的显示,其输出如下:

[u'audio', u'video']
{
    "@index": "0",
    "@codec_name": "h264",
    "@codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
    "@profile": "Main",
    "@codec_type": "video",
    "@codec_time_base": "1/50",
    "@codec_tag_string": "avc1",
    "@codec_tag": "0x31637661",
    "@width": "1280",
    "@height": "720",
    "@coded_width": "1280",
    "@coded_height": "720",
    "@has_b_frames": "0",
    "@sample_aspect_ratio": "1:1",
    "@display_aspect_ratio": "16:9",
    "@pix_fmt": "yuv420p",
    "@level": "31",
    "@chroma_location": "left",
    "@refs": "1",
    "@is_avc": "1",
    "@nal_length_size": "4",
    "@r_frame_rate": "25/1",
    "@avg_frame_rate": "25/1",
    "@time_base": "1/12800",
    "@start_pts": "0",
    "@start_time": "0.000000",
    "@duration_ts": "67584",
    "@duration": "5.280000",
    "@bit_rate": "1205959",
    "@bits_per_raw_sample": "8",
    "@nb_frames": "132",
    "disposition": {
        "@default": "1",
        "@dub": "0",
        "@original": "0",
        "@comment": "0",
        "@lyrics": "0",
        "@karaoke": "0",
        "@forced": "0",
        "@hearing_impaired": "0",
        "@visual_impaired": "0",
        "@clean_effects": "0",
        "@attached_pic": "0"
    },
    "tag": [
        {
            "@key": "creation_time",
            "@value": "1970-01-01 00:00:00"
        },
        {
            "@key": "language",
            "@value": "und"
        },
        {
            "@key": "handler_name",
            "@value": "VideoHandler"
        }
    ]
}
### Python视频语义压缩的方法 对于基于Python视频语义压缩,通常涉及多个阶段的工作流程,包括但不限于特征提取、编码优化以及解码重建。虽然`langchain`库专注于自然语言处理任务[^1],但针对视频语义压缩的需求,其他专门设计用于计算机视觉和多媒体处理的库更为适用。 #### 使用PyTorch与OpenCV实现简单版本的视频语义压缩方案 为了简化说明过程,在此提供一种利用深度学习模型结合传统图像处理技术来完成视频帧间相似度计算并据此实施压缩策略的方式: - **环境准备** 首先需确保已安装必要的依赖包,如`torchvision`, `opencv-python`等。这些工具提供了访问预训练神经网络模型的能力,同时也支持高效的图像读写操作。 ```bash pip install torch torchvision opencv-python numpy scikit-video ``` - **核心算法逻辑** 下面给出一段示范性的代码片段,展示了如何通过比较相邻两帧之间的差异程度来进行简单的视频压缩处理。这里采用的是光流法估计连续画面间的运动情况,并以此作为判断依据决定是否保留当前帧。 ```python import cv2 import skvideo.io import numpy as np from skimage.metrics import structural_similarity as ssim def compress_video(input_path, output_path, threshold=0.95): reader = skvideo.io.FFmpegReader(input_path) writer = None prev_frame = None for frame in reader.nextFrame(): gray_frame = cv2.cvtColor(frame.astype('uint8'), cv2.COLOR_BGR2GRAY) if prev_frame is not None: score, _ = ssim(gray_frame, prev_frame, full=True) if score < threshold: if writer is None: height, width = frame.shape[:2] fourcc = cv2.VideoWriter_fourcc(*'mp4v') writer = cv2.VideoWriter(output_path, fourcc, 30.0, (width, height)) writer.write(frame) prev_frame = gray_frame if writer is not None: writer.release() ``` 上述脚本实现了基础版的视频语义压缩机制,即当两个连续帧之间存在显著变化(由SSIM指数衡量)时才将其加入最终输出文件中;反之则跳过重复或近似的内容以达到减少数据量的目的。 需要注意的是,这只是一个非常初级的例子,实际应用中的高效视频压缩往往涉及到更复杂的编解码器配置和技术细节调整。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值