我开始使用scikit-video,但在编写文件时遇到问题。我已经将问题简化为最简单的示例
vid_file = "6710185719062326259_stamp_25pct.mp4"
output_file = "out_temp3.mp4"
reader = skvideo.io.FFmpegReader(vid_file)
writer = skvideo.io.FFmpegWriter(output_file)
for frame in reader.nextFrame():
writer.writeFrame(frame)
writer.close()
我正在 VLC 中播放文件,vid_file
有效,但输出文件虽然可播放,但主要是大的绿色块(尽管我可以从其中的原始视频中辨别出一些细节)。
我的目标,或者当然,是在写出来之前对框架进行"有趣"的操作,但我需要先让"不修改"版本正常工作。我也将在大文件上使用它,因此一次处理整个文件的vread/vwrite
函数是不合适的。
我猜我需要在 FFmpegWriter 的outputdict
参数中设置适当的值,但有太多,我不知道从哪里开始。我试过了
writer = skvideo.io.FFmpegWriter(output_file, outputdict={'-crf': '0', '-pix_fmt': 'rgb24'})
(-crf 0
抑制任何压缩,-pixfmt rgb24
因为这是FFmpegReader默认提供的,但这些也不起作用。
关于如何使这项工作的任何想法?
下面是输入文件的skvideo.io.ffprobe
视频信息。
{
"@index": "0",
"@codec_name": "h264",
"@codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
"@profile": "High",
"@codec_type": "video",
"@codec_time_base": "1/30",
"@codec_tag_string": "avc1",
"@codec_tag": "0x31637661",
"@width": "480",
"@height": "270",
"@coded_width": "480",
"@coded_height": "272",
"@has_b_frames": "2",
"@pix_fmt": "yuv420p",
"@level": "21",
"@chroma_location": "left",
"@refs": "1",
"@is_avc": "true",
"@nal_length_size": "4",
"@r_frame_rate": "15/1",
"@avg_frame_rate": "15/1",
"@time_base": "1/15360",
"@start_pts": "0",
"@start_time": "0.000000",
"@duration_ts": "122880",
"@duration": "8.000000",
"@bit_rate": "183806",
"@bits_per_raw_sample": "8",
"@nb_frames": "120",
"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",
"@timed_thumbnails": "0"
},
"tag": [
{
"@key": "language",
"@value": "und"
},
{
"@key": "handler_name",
"@value": "VideoHandler"
}
]
}
我会提到,当我ffprobe输出文件时,我看到的唯一区别是1)时序数据不同,这并不奇怪,以及2)输出文件具有
"@has_b_frames": "0",
"@pix_fmt": "yuv444p",
我很有信心读者工作正常,因为如果我用
skimage.io.imsave('x.png', frame, check_contrast=False)
它看起来不错。
(回答我自己的问题,以防有人遇到类似的问题。其中大部分来自llogan的评论。
分辨率:scikit-video的FFmpegWriter()
生成了一个有效的视频,但我的旧版本的VLC无法正常播放。
我学到的其他信息,可能看起来很明显,但让我感到困惑:
-
在
FFmpegWriter(output_file, outputdict={'-pix_fmt': <FORMAT>}
中,FORMAT描述了帧在写入文件之前应该被编码的方式,而不是传递给它的帧的格式。 -
FFmepgReader
似乎默认产生rgb24
,FFmpegWritter
似乎很乐意接受这作为输入。 -
yuv420p
似乎是过去最常见的MP4格式,但现在yuv444p
似乎被更多地使用,并且是FFmpegWriter
将使用的默认格式。 -
如果要获得最大的兼容性,请将 FORMAT 设置为
yuv420p
。 -
尝试在不支持它的程序中播放
yuv444p
可能会产生"视频已损坏"消息或许多奇怪的绿色块。