Python 使用skvideo.io.FFmpegWriter从相机写入帧

Python 使用skvideo.io.FFmpegWriter从相机写入帧,python,opencv,ffmpeg,video-capture,scikits,Python,Opencv,Ffmpeg,Video Capture,Scikits,我正在尝试使用skvideo.io.FFmpegWriter和cv2.VideoCapture对动态捕获的相机图像帧的视频编码进行精细控制,例如 但是,我在Jupyter笔记本中遇到以下例外情况: --------------------------------------------------------------------------- TypeError Traceback (most recent call last)

我正在尝试使用skvideo.io.FFmpegWriter和cv2.VideoCapture对动态捕获的相机图像帧的视频编码进行精细控制,例如

但是,我在Jupyter笔记本中遇到以下例外情况:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

<ipython-input-33-007a547c4229> in <module>()
     18     while range(fps*10):
     19         ret, frame = stream.read()
---> 20         video.writeFrame(frame)
     21 except BaseException as err:
     22     raise err

/usr/local/lib/python3.6/site-packages/skvideo/io/ffmpeg.py in writeFrame(self, im)
    446         T, M, N, C = vid.shape
    447         if not self.warmStarted:
--> 448             self._warmStart(M, N, C)
    449 
    450         # Ensure that ndarray image is in uint8

/usr/local/lib/python3.6/site-packages/skvideo/io/ffmpeg.py in _warmStart(self, M, N, C)
    412         cmd = [_FFMPEG_PATH + "/" + _FFMPEG_APPLICATION, "-y"] + iargs + ["-i", "-"] + oargs + [self._filename]
    413 
--> 414         self._cmd = " ".join(cmd)
    415 
    416         # Launch process

TypeError: sequence item 3: expected str instance, int found
将此更改为video.writeframe.tostring会导致ValueError:数据输入不正确,使我感到困惑

我应该如何编写OpenCV返回给我的FFmpegWriter实例的每个帧

编辑
如果我从io.FFmpegWriter调用中删除inputdict和outputdict,代码工作正常,然而,这对我来说并不是目的,因为我需要对视频编码进行精细控制。我正在尝试对从相机捕获的原始视频进行无损/近无损压缩,并试图根据我的需要在压缩与保真度方面达成最佳折衷。

这里需要注意的几点:

skvideo.io.FFmpegWriter使用ffmpeg命令行工具编码视频,而不是使用C API。所以,首先在终端中测试ffmpeg命令,以确保有一个工作管道。 inputdict={},outputdict={}接受字符串输入而不是整数。如果您有一个整数变量,则使用strvar\u name将其转换为字符串。 您必须确保您使用的pix_fmt受编解码器支持。要获得所有pix_FMT的列表,请使用ffmpeg-pix_FMT。请记住,x264并不接受ffmpeg内部支持的所有pix_FMT。 因此,对于近乎无损的编码,请参见,我们可以使用以下命令:

ffmpeg-s 1920x1080-r 60-i/dev/video0-s 1920x1080-r 60-c:v libx264-crf 17-预设超快-pix_fmt yuv444p test_ffmpeg.avi

转换为skvideo.io.FFmpegWriter的相同命令为:

fps = 60
width = 1920
height = 1080
crf = 17
video = io.FFmpegWriter('/tmp/test_ffmpeg.avi', 
            inputdict={'-r': str(fps), '-s':'{}x{}'.format(width,height)},
            outputdict={'-r': str(fps), '-c:v': 'libx264', '-crf': str(crf), '-preset': 'ultrafast', '-pix_fmt': 'yuv444p'}
)

谢谢你@zindarod的解释-这帮了大忙!所述方法不实例化FFmpeg子流程,而只是准备所需的参数。
fps = 60
width = 1920
height = 1080
crf = 17
video = io.FFmpegWriter('/tmp/test_ffmpeg.avi', 
            inputdict={'-r': str(fps), '-s':'{}x{}'.format(width,height)},
            outputdict={'-r': str(fps), '-c:v': 'libx264', '-crf': str(crf), '-preset': 'ultrafast', '-pix_fmt': 'yuv444p'}
)