1. 下载FFmpeg,解压后将bin目录添加到环境变量 https://www.ffmpeg.org/,也可以使用opencv

ffmpeg java 获取视频图片_ide

  1. 修改crop_time 后面的时间和videoPathimagePath 即可
    **注意:**images后面需要有 两个\\
import os

def getImage(videoPath, imagePath):
    img_count = 1
    crop_time = 0.0
    #转化多少秒的视频
    while crop_time <= 40.0:
        os.system('ffmpeg -i %s -f image2 -ss %s -vframes 1 %s.png' % (videoPath, str(crop_time), imagePath + str(img_count)))
        img_count += 1
        print('Geting Image ' + str(img_count) + '.png' + ' from time ' + str(crop_time))
        #每多少秒截取一张照片
        crop_time += 0.25
    print('Image Collected')

if __name__ == '__main__':
    videoPath = r'D:\ARDemo\2019_06_25_12_31_16_645.mp4'
    #注意:images后面需要有 两个\\
    imagePath = r'D:\ARDemo\images\\'
    getImage(videoPath, imagePath)

由于需求变更,需要对路口进行扩展补充,数据是间断的且分布在不同包

可以根据图片的名字批量提取对应的图片并保存到另一个文件夹

【间断数据图】

ffmpeg java 获取视频图片_Image_02

  1. 整体提取图片
    先把分布在各个文件夹内所有图片提取到一个文件夹下
# -*- coding: utf-8 -*-
import time
import os 
import shutil

def get_file(root_path,suffix): 
    try:
        for dir_name in os.listdir(root_path):
            exts = suffix.split(' ')
            #获取目录或文件的路径
            file_path = os.path.join(root_path,dir_name)
            #判断路径为文件还是路径
            if os.path.isdir(file_path):
                #递归获取所有文件和目录的路径                               
                get_file(file_path,suffix)      
            else:
                for ext in exts:
                    #根据后缀名判断文件类别
                    if(dir_name.endswith(ext)):
                        file_exits_path = to_path + '\\' + dir_name
                        #如果文件夹在移动的目录下,跳过它
                        if not os.path.exists(file_exits_path):
                            shutil.copy(file_path,to_path)
    except FileNotFoundError:
        print('地址输入错误,请检查地址'.center(20,'-'))
        time.sleep(1.2)
                   

if __name__ == "__main__":
    root_path = input('请输入 图片 所在地址:')
    to_path  = input('请输入 图片 要存放的地址:')
    suffix = '.png .jpg .psd .afphoto'
    get_file(root_path,suffix)
  1. 再把需要提取的文件写入到getImage.txt 文件中,根据名称提取文件。
    也可以使用 图像处理库PIL 中的Image.open -> save 方法,不过提取较慢
    当然也可以 根据名称提取指定文件夹,把 shutil.copy -> shutil.move (相当于剪切) 即可
# -*- coding: UTF-8 -*- 
import shutil

root_path = input('请输入 图片 所在地址:')
to_path  = input('请输入 图片 要存放的地址:')
data = []

for line in open(r"C:\Users\Desktop\getImage.txt", "r"):  # 设置文件对象并读取每一行文件
    data.append(line)

for a in data:
    file_path = root_path + '/{}'.format(a[:-1])
    shutil.copy(file_path, to_path)
  1. 整体提取文件夹(补充)
    由于文件夹层级结构可能些许复杂:一个一级目录下可能有很多二级目录,一个二级目录下可能有很多文件,把这些文件夹提取出来放到一个目录下以便处理
# _*_coding:utf-8
import os
import shutil
import time

def get_file(root_path,suffix):  
    try:
        for dir_name in os.listdir(root_path):
            exts = suffix.split(' ')
            #获取目录或文件的路径
            file_path = os.path.join(root_path,dir_name)
            #判断路径为文件还是路径
            if os.path.isdir(file_path):
                #递归获取所有文件和目录的路径
                get_file(file_path,suffix)  
            else:
                for ext in exts:
                    #根据后缀名判断文件类别
                    if(dir_name.endswith(ext)):
                        fileName_listdir = '\\'.join(file_path.split('\\')[:-1])
                        if fileName_listdir not in data_address:
                            data_address.append(fileName_listdir)
    except FileNotFoundError:
        print('地址输入错误,请检查地址'.center(20,'-'))
        time.sleep(1.2)


def main():
    get_file(root_path,suffix)
    # datas = list(set(data_address))
    for data in data_address:
        data_split = to_path + '\\' + data.split('\\')[-1]
        #如果文件夹存在移动的目录下,跳过它
        if not os.path.exists(data_split):
            shutil.move(data,to_path)
    print('文件夹拷贝完成'.center(20,'-'))
    time.sleep(1.2)


if __name__ == "__main__":
    root_path = input('请输入 文件夹 所在地址:')
    to_path = input('请输入 文件夹 移动到的地址:')
    suffix = '.jpg'
    data_address = []
    main()