以下代码的目的是从视频列表中提取帧。 为此,我在python 3.5 extract_frames函数中定义,它调用 extract_frame函数。在后者中,给出 ffmpeg 指令来提取帧
def extract_frames(vidlist,vidDir,outputDir):
f = open(vidlist, 'r')
vids = f.readlines()
f.close()
vids = [video.rstrip() for video in vids]
for vid in vids:
videoName = os.path.join(vidDir,vid.split('.')[0]+".avi")
frameName = os.path.join(outputDir, vid.split('.')[0]+".jpeg")
extract_frame(videoName,frameName)
extract_frames(trainlist01, ucf101_path,training_output)
这样:
ucf101_path = "/local/common-data/UCF/UCF-101" # Path to the root dataset
trainlist01="/local/common-data/UCF/ucfTrainTestlist/trainlist01.txt"
training_output = '/local/common-data/UCF/tmp_frames/train/'
其中 trainlist01.txt 包含以下一组行(第一列是视频的路径,第二列是视频的类):
ApplyEyeMakeup / v_ApplyEyeMakeup_g08_c01.avi 1 .....
视频名称和 framename 例如对应于:
videoname="/local/common-data/UCF/UCF-101/YoYo/v_YoYo_g07_c04.avi"
framename="/local/common-data/UCF/tmp_frames/test/YoYo/v_YoYo_g07_c04.jpeg"
以下函数返回错误
import subprocess
def extract_frame(videoName,frameName):
if not os.path.exists(videoName):
print('%s does not exist!' % videoName)
return False
# call ffmpeg and grab its stderr output
p = subprocess.call('ffmpeg -i %s -r 1 -s qvga -t 1 -f image2 %s' % (videoName,frameName), shell=True)
return p
错误是: [image2 @ 0x422ff80]无法打开文件:/local/common-data/UCF/tmp_frames/train/YoYo/v_YoYo_g25_c05.jpeg av_interleaved_write_frame():输入/输出错误
和输出文件 training_output 我应该得到我的帧是空的。
文件和文件夹广告子文件夹可以。
我的代码出了什么问题?
编辑1
创建子文件夹YoYo / in / local / common-data / UCF / tmp_frames / train /后再次运行代码我得到了这个新错误:
Could not get frame filename number 2 from pattern '/local/common-data/UCF/tmp_frames/train/YoYo/v_YoYo_g25_c05.jpeg' (either set updatefirst or use a pattern like %03d within the filename pattern) av_interleaved_write_frame(): Invalid argument
答案 0 :(得分:0)
使用以下命令修复问题:
p = subprocess.call('ffmpeg -i %s -vf scale=224:-1 %s' % (videoName,frameName), shell=True)