FFmpegReader/FFmpegWriter在scikit-video中的基本"pass-through"用法



我开始使用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似乎默认产生rgb24FFmpegWritter似乎很乐意接受这作为输入。

  • yuv420p似乎是过去最常见的MP4格式,但现在yuv444p似乎被更多地使用,并且是FFmpegWriter将使用的默认格式。

  • 如果要获得最大的兼容性,请将 FORMAT 设置为yuv420p

  • 尝试在不支持它的程序中播放yuv444p可能会产生"视频已损坏"消息或许多奇怪的绿色块。

相关内容

  • 没有找到相关文章

最新更新