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