如何在OpenCV中获取VideoCapture对象的4字符编解码器代码?

eoxn13cs  于 2023-04-21  发布在  其他
关注(0)|答案(3)|浏览(128)

如何从OpenCV 4中的VideoCapture对象中检索四个字符的编解码器代码?当我尝试检查它时,我得到一个浮点数:

import cv2

movie_name = 'fubar.mp4'
movie = cv2.VideoCapture(movie_path)
codec_code =  movie.get(cv2.CAP_PROP_FOURCC)
print(codec_code)

这会打印出类似828601953.0的东西。有很多关于如何 * 创建 * 编解码器代码的线程,但我还没有找到任何关于如何从Python中的任意VideoCapture对象中提取和读取编解码器代码的线程。
我知道文件的名称是信息性的(mp4),但这并没有真正指定我所追求的确切的四字符编码(例如,如果我想在一些处理后重新保存为新电影,或者只是将代码作为元数据显示给用户)。

相关主题

有一个关于如何在C++中做到这一点的线程,如果有人可以翻译到Python,我想这就是答案:
Qt or OpenCV: print out the codec of a video file

8qgya5xd

8qgya5xd1#

试试这个:

hex(int(828601953.0))

打印:

'0x31637661'

现在执行man ascii以获取ASCII表并查找十六进制:

31 = 1
63 = c
76 = v
61 = a

所以你的FOURCC是avc1
不确定Python中是否有更好的方法,但这似乎是可以的:

h = int(828601953.0)
chr(h&0xff) + chr((h>>8)&0xff) + chr((h>>16)&0xff) + chr((h>>24)&0xff)

打印:

'avc1'
bq3bfh9z

bq3bfh9z2#

Python字节数

>>> import sys
>>> int(828601953).to_bytes(4, byteorder=sys.byteorder).decode()
'avc1'

这就是你所需要的,但是如果你想了解它是如何工作的,请继续阅读。

详情

Python有一个名为bytes的内置类型,这使得解析FOURCC代码变得微不足道。让我们扩展上述解决方案,使每个步骤更加清晰:

>>> h = int(828601953)
>>> b = h.to_bytes(4, byteorder=sys.byteorder)
>>> s = b.decode()
>>> s
'avc1'

步骤

1.创建整数

将您的数字转换为整数(如果还没有)。

>>> h = int(828601953)
2.将整数转换为字节

Python整数可以转换成一种数据类型,Python混淆地称之为“bytes”,它只是8位值的流。要进行转换,Python需要知道有多少字节以及字节顺序(“big”,“little”或sys.byteorder)。
虽然FourCC被定义为big-endian,但Intel处理器是 little-endian,并且向后读取字节。这就是为什么目前接受的答案颠倒了顺序。最好不要编写依赖于CPU的字节顺序的代码,因此我们将使用sys.byteorder,这表明Python应该使用主机的本地字节顺序。

>>> b = h.to_bytes(4, byteorder=sys.byteorder)
3.将字节解码为字符串

一旦我们有了一个Python bytes对象,我们只需要求它将自己解码成一个字符串。

>>> s = b.decode()
4.仅此而已

>>> s
'avc1'

封装到函数中

这是一个函数,灵感来自@Mikhail-Lobanov编写的函数。

import sys
def get_fourcc(cap: cv2.VideoCapture) -> str:
    """Return the 4-letter string of the codec the camera is using."""
    return int(cap.get(cv2.CAP_PROP_FOURCC))\
             .to_bytes(4, byteorder=sys.byteorder).decode()
uubf1zoe

uubf1zoe3#

def get_fourcc(cap: cv2.VideoCapture):
    fourcc = int(cap.get(cv2.CAP_PROP_FOURCC))
    fourcc = bytes([
        v & 255 for v in (fourcc, fourcc >> 8, fourcc >> 16, fourcc >> 24)
    ]).decode()
    return fourcc

答案基于LorenaGdLOpenCV Forum上的答案。

相关问题