我们将视频保存在移动客户端上并将其发送到服务器。在服务器上,我使用以下代码保存框架:>
import skvideo.io
import cv2
haar =
'/home/ubuntu/opencv/data/haarcascades/haarcascade_frontalface_alt.xml'
face_cascade = cv2.CascadeClassifier(haar)
ret = True
video = 'my_video.mov'
i = 0
while ret == True:
cap = skvideo.io.VideoCapture(video)
ret, frame = cap.read()
cv2.imwrite('frame_'+str(i)+'.jpg',frame)
i+=1
当我们在Windows媒体播放器或itunes上播放视频时,它看起来不错。即玩家知道如何定位它。
但skvideo.io不知道,我们保存的那些帧逆时针旋转了90度。
我们如何将信息嵌入到视频文件(.mov)文件中,该视频文件知道正确的方向?
答案 0 :(得分:4)
skvideo中出现了一个小故障,它没有读取可用的元数据。对于在移动设备中拍摄的视频是旋转的,但元数据包括此类参数skvideo团队提交了一个修复程序,当前的skvideo版本1.1.7从移动设备读取元数据,表明视频应该是漫游的。然后skvideo.io.vread旋转文件:
1)使用较新的skvideo版本,1.1.7可以在https://github.com/scikit-video/scikit-video克隆
2)您可以使用以下代码来阅读视频中的所有帧,很可能会读取元数据
import skvideo.io
videogen = skvideo.io.vread(f.name)
如果以纵向模式拍摄,将自动旋转视频。
3)在skvideo repo上创建了一个问题,请查看更多参考资料:https://github.com/scikit-video/scikit-video/issues/40
答案 1 :(得分:3)
OpenCV
似乎没有使用VideoCapture()
记录视频文件的轮播元数据,正如您所存储的propId
所见。
我不确定scikit-video
是否有。看起来他们有一个名为ffprobe的元数据拉取器,它可以拉动旋转。有关如何调用和查看输出的示例,请参阅here。这显示了一个庞大的元数据列表 - 没有旋转---但这可能只是因为它没有设置或者没有旋转元数据的电影类型。
获取它的另一种方法是直接从ffmpeg
读取元数据。我发现old StackOverflow answer编写了一些python
代码,使用ffmpeg
专门从视频中提取旋转元数据。
答案 2 :(得分:1)
我安装了'ffmpeg'('ffprobe')。我的电脑是 Ubuntu 18.04。
然后 Python,get_rotation()
函数对我有用。
功能代码:
import subprocess
import shlex
import json
def get_rotation(self, file_path_with_file_name):
cmd = "ffprobe -loglevel error -select_streams v:0 -show_entries stream_tags=rotate -of default=nw=1:nk=1"
args = shlex.split(cmd)
args.append(file_path_with_file_name)
ffprobe_output = subprocess.check_output(args).decode('utf-8')
if len(ffprobe_output) > 0: # Output of cmdis None if it should be 0
ffprobe_output = json.loads(ffprobe_output)
rotation = ffprobe_output
else:
rotation = 0
return rotation