如何从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
3条答案
按热度按时间8qgya5xd1#
试试这个:
打印:
现在执行
man ascii
以获取ASCII表并查找十六进制:所以你的FOURCC是
avc1
。不确定Python中是否有更好的方法,但这似乎是可以的:
打印:
bq3bfh9z2#
Python字节数
这就是你所需要的,但是如果你想了解它是如何工作的,请继续阅读。
详情
Python有一个名为
bytes
的内置类型,这使得解析FOURCC代码变得微不足道。让我们扩展上述解决方案,使每个步骤更加清晰:步骤
1.创建整数
将您的数字转换为整数(如果还没有)。
2.将整数转换为字节
Python整数可以转换成一种数据类型,Python混淆地称之为“bytes”,它只是8位值的流。要进行转换,Python需要知道有多少字节以及字节顺序(“big”,“little”或sys.byteorder)。
虽然FourCC被定义为big-endian,但Intel处理器是 little-endian,并且向后读取字节。这就是为什么目前接受的答案颠倒了顺序。最好不要编写依赖于CPU的字节顺序的代码,因此我们将使用
sys.byteorder
,这表明Python应该使用主机的本地字节顺序。3.将字节解码为字符串
一旦我们有了一个Python bytes对象,我们只需要求它将自己解码成一个字符串。
4.仅此而已
瞧
封装到函数中
这是一个函数,灵感来自@Mikhail-Lobanov编写的函数。
uubf1zoe3#
答案基于LorenaGdL在OpenCV Forum上的答案。