scikit-video读写视频

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"
        }
    ]
}

猜你喜欢

转载自blog.csdn.net/Dillon2015/article/details/80223474