gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:45:21 25 4
gpt4 key购买 nike

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

from skvideo import io
import cv2

fps = 60
stream = cv2.VideoCapture(0) # 0 is for /dev/video0
print("fps: {}".format(stream.set(cv2.CAP_PROP_FPS, fps)))

stream.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
stream.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
print("bit_depth: {}".format(stream.set(cv2.CAP_PROP_FORMAT, cv2.CV_8U)))

video = io.FFmpegWriter('/tmp/test_ffmpeg.avi',
inputdict={'-r': fps, '-width': 1920, '-height': 1080},
outputdict={'-r': fps, '-vcodec': 'libx264', '-pix_fmt': 'h264'}
)

try:
for i in range(fps*10): # 10s of video
ret, frame = stream.read()
video.writeFrame(frame)
finally:
stream.release()

try:
video.close()
except:
pass

但是,我得到以下异常(在 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(frame.tostring())结果 ValueError: Improper data input ,让我难过。

我应该如何将每一帧(由 OpenCV 返回)写入我的 FFmpegWriter 实例?

编辑

如果我删除 inputdict,代码可以正常工作和 outputdict来自 io.FFmpegWriter调用,但是这违背了我的目的,因为我需要对视频编码进行精细控制(我正在尝试对从相机捕获的原始视频进行无损/近无损压缩,并试图在压缩与保真度方面建立最佳折衷满足我的需要)。

最佳答案

这里需要注意几点:

  • skvideo.io.FFmpegWriter使用 ffmpeg用于编码视频的命令行工具,而不是 C API。所以测试你的ffmpeg首先在终端中命令以确保您有一个工作管道。
  • inputdict={},outputdict={}接受字符串输入而不是整数。如果你有一个整数变量,那么使用 str(var_name)将其转换为字符串。
  • 您必须确保 pix_fmt您正在使用的编解码器支持。获取所有 pix_fmt 的列表使用 ffmpeg -pix_fmts .请记住 x264不接受所有pix_fmtffmpeg内部支持。

  • 因此,对于近乎无损的编码(参见 thisthis ),我们可以使用以下命令:
    ffmpeg -s 1920x1080 -r 60 -i /dev/video0 -s 1920x1080 -r 60 -c:v libx264 -crf 17 -preset ultrafast -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'}
    )

    关于python - 使用 skvideo.io.FFmpegWriter 从相机写入帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51072238/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com