MUSIC-AVQA复现(2)——从视频中提取帧

示例代码:MUSIC-AVQA/extract_frames.py at main · GeWu-Lab/MUSIC-AVQA (github.com)

本文作者:刘泉辰

时间:2023年3月4日MUSIC-AVQA

目录

一、argparse模块的使用

1.1 argparse 模块简介

1.2 argparse模块的使用步骤

1.2.1 创建解析器:

1.2.2 添加参数:

1.2.3 获取参数:

二、ffmpeg——从视频中提取帧

三、os模块的使用

四、extract_frames.py


一、argparse模块的使用

1.1 argparse 模块简介

argparsepython标准库里面用来处理命令行参数的库;大多数情况下,脚本很可能需要多个参数,而且每次参数的类型用处各不相同,那么这个时候在参数前添加标签表明参数的类型和用途便十分有用,而利用argparse模块可以很方便得实现这一目的。

官方文档中给出的argparse模块的解释:

The argparse module makes it easy to write user-friendly command-line interfaces. The program defines what arguments it requires, and argparse will figure out how to parse those out of sys.argv. The argparse module also automatically generates help and usage messages. The module will also issue errors when users give the program invalid arguments.

翻译一下就是:

argparse模块使编写用户友好的命令行界面变得容易。这个程序定义它需要的参数,argparse会弄清楚如何在sys.argv中解析这些参数。argparse模块还自动生成帮助和使用信息。当用户给程序提供无效参数时,该模块也会报错。

1.2 argparse模块的使用步骤

  • 导入argparse模块:

    import argparse
  • 实例化一个对象:

    parser=argparse.ArgumentParser()
  • 加入参数或选项:

    parser.add_argument()
  • 获取参数:

    args=parser.parse_args()

1.2.1 创建解析器:

创建一个ArgumentParser对象parserparser包含将命令行解析成 Python 数据类型所需的全部信息

import argparse
parser = argparse.ArgumentParser()          # 实例化对象

1.2.2 添加参数

给一个 ArgumentParser 添加程序参数信息是通过调用 add_argument() 方法完成的。通常,这些调用指定 ArgumentParser 如何获取命令行字符串并将其转换为对象。这些信息在 parse_args() 调用时被存储和使用。例如:

parser.add_argument('--out_dir', dest='out_dir', type=str, default='D:\MUSIC-AVQA\\test_frames')
parser.add_argument('--video_path', dest='video_path', type=str, default='D:\MUSIC-AVQA\\test_videos')
  • name or flags - 一个命名或者一个选项字符串的列表,例如 foo-f, --foo

  • action - 当参数在命令行中出现时使用的动作基本类型。

  • nargs - 命令行参数应当消耗的数目。

  • const - 被一些 actionnargs 选择所需求的常数。

  • default - 当参数未在命令行中出现并且也不存在于命名空间对象时所产生的值,即默认值。

  • type - 命令行参数应当被转换成的类型。

  • choices - A sequence of the allowable values for the argument.

  • required - 此命令行选项是否可省略 (仅选项可用)。

  • help - 一个此选项作用的简单描述。

  • metavar - 在使用方法消息中使用的参数值示例。

  • dest - 被添加到 parse_args() 所返回对象上的属性名。

这里需要注意的是,name参数分为可选参数和位置参数。具体可以参考:(20条消息) argparse模块Day230:argparse模块的位置参数和可选参数weixin_39614561的博客-CSDN博客

1.2.3 获取参数:

# 通常 parse_args() 会被不带参数调用,而 ArgumentParser 将自动从 sys.argv 中确定命令行参数
# parse_args(args=None, namespace=None) 将参数字符串转换为对象并将其设为命名空间,返回带有成员的命名空间
# args - 要解析的字符串列表。 默认值是从 sys.argv 获取。
# namespace - 用于获取属性的对象。 默认值是一个新的空 Namespace 对象。
args = parser.parse_args()

二、ffmpeg——从视频中提取帧

# The completed command is: 
# ffmpeg -i D:\MUSIC-AVQA\test_videos\00000002.mp4 -y -r 1 D:\MUSIC-AVQA\test_frames\00000002/%06d.jpg
def extract_frames(video, dst):
    command1 = 'ffmpeg '
    command1 += '-i ' + video + " "
    command1 += '-y' + " "
    command1 += "-r " + "1 "
    command1 += '{0}/%06d.jpg'.format(dst)

参数详释:

# -i: 源文件
# -y: 不经过确认,输出时直接覆盖同名文件。
# -r: 指定抽取视频的帧率,即从视频中每秒抽取的帧数,默认是每秒24帧
# 在服务器上执行命令时,ffmpeg命令可自动为图片按照规定格式依次命名

三、os模块的使用

在MUSIC-AVQA整个项目中,使用极为频繁的几个os模块的函数均列举在下面。

vid_list = os.listdir(args.video_path)
  • os.listdir:用于返回指定的文件夹包含的文件或文件夹的名字的列表

name = os.path.join(args.video_path, vid_id)
  • os.path.join:把目录和文件名合成一个路径

os.path.exists(dst)
  • os.path.exists() :查看给定的文件/目录是否存在,若存在则返回true

os.makedirs(dst)
  • os.makedirs() :用于递归创建目录

os.system(command1)
  • os.system(cmd):仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息。

  • os.system( ) 的返回值:如果执行成功,那么会返回0,表示命令执行成功。否则,则是执行错误。

Python中的OS模块提供了非常丰富的文件/目录处理方法,具体可参加官方文档:os --- 多种操作系统接口 — Python 3.11.2 文档

英文阅读困难的读者可以考虑查阅菜鸟:Python OS 文件/目录方法 | 菜鸟教程 (runoob.com)

四、extract_frames.py

import os
import argparse
#argparse 模块可以让人轻松编写用户友好的命令行接口。
​
def extract_frames(video, dst):
    command1 = 'ffmpeg '
    command1 += '-i ' + video + " "
    command1 += '-y' + " "
    command1 += "-r " + "1 "
    command1 += '{0}/%06d.jpg'.format(dst)
​
    # command1为:ffmpeg -i D:\MUSIC-AVQA\test_videos\00000002.mp4 -y -r 1 D:\MUSIC-AVQA\test_frames\00000002/%06d.jpg
    # -i: 源文件
    # -y: 不经过确认,输出时直接覆盖同名文件。
    # -r: 指定抽取视频的帧率,即从视频中每秒抽取的帧数,默认是每秒24帧
    # 在服务器上执行命令时,ffmpeg命令可自动为图片按照规定格式依次命名
    os.system(command1)         # system函数可以将字符串转化成命令在服务器上运行
    return
​
if __name__ == '__main__':
​
    # 创建解析器:创建一个ArgumentParser对象parser,parser包含将命令行解析成 Python 数据类型所需的全部信息
    parser = argparse.ArgumentParser()
​
    # 添加参数
    # 给一个 ArgumentParser 添加程序参数信息是通过调用 add_argument() 方法完成的。
    # 调用指定 ArgumentParser 获取命令行字符串并将其转换为对象的方式;这些信息在 parse_args() 调用时被存储和使用。
    # dest 确定 parse_args() 所返回对象的一个属性的属性名
    # type 用于对命令行参数进行类型检查和类型转换
    # default 参数未在命令行中出现并且也不存在于命名空间对象时,参数所需要的值
    parser.add_argument('--out_dir', dest='out_dir', type=str, default='D:\MUSIC-AVQA\\test_frames')
    parser.add_argument('--video_path', dest='video_path', type=str, default='D:\MUSIC-AVQA\\test_videos')
​
    # 通常 parse_args() 会被不带参数调用,而 ArgumentParser 将自动从 sys.argv 中确定命令行参数
    # parse_args(args=None, namespace=None) 将参数字符串转换为对象并将其设为命名空间,返回带有成员的命名空间
    # args - 要解析的字符串列表。 默认值是从 sys.argv 获取。
    # namespace - 用于获取属性的对象。 默认值是一个新的空 Namespace 对象。
    args = parser.parse_args()
​
    vid_list = os.listdir(args.video_path)
​
    for vid_id in vid_list:
        name = os.path.join(args.video_path, vid_id)
        dst = os.path.join(args.out_dir, vid_id[:-4])       # 删除’.mp4‘,仅以数字作为文件夹名称
        print(dst)
        if not os.path.exists(dst):          # os.path.exists() 查看给定的文件/目录是否存在,若存在则返回true
            os.makedirs(dst)                 # os.makedirs() 用于递归创建目录
        extract_frames(name, dst)            # 提取视频帧
        print("finish video id: " + vid_id)

                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏劫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值