Python + Hachoir-Metadata - 从.MP4文件中读取FPS标记

时间:2015-01-08 22:24:09

标签: python video metadata mp4 hachoir-parser

我在 Python 中编写Windows应用程序,该应用程序必须从 .MP4 视频文件中读取元数据

我开始在Python 3中编写应用程序,但无法找到合适的模块来读取视频文件中的元数据。当我使用3to2将整个项目移动到Python 2时,我可以使用pip install hachoir-core安装Hachoir-Metadata,这在整个网络中受到称赞,{{1} }和pip install hachoir-parser

我使用了以下代码:

pip install hachoir-metadata

这返回了以下元数据:

  • 持续时间:37秒940毫秒
  • 图片宽度:1280像素
  • 图像高度:960像素
  • 创作日期:2014-12-13 19:27:36
  • 最后修改时间:2014-12-13 19:27:36
  • 评论:播放速度:100.0%
  • 评论:用户量:100.0%
  • MIME类型:video / quicktime
  • Endianness:Big endian

这很棒,除了我真的需要知道每秒帧数(FPS)。对于.AVI文件,Hachoir-Metadata确实显示了FPS,正如您可以从此测试输出中看到的那样:

  • 持续时间:6秒66毫秒
  • 图片宽度:256像素
  • 图像高度:240像素
  • 帧率:30.0 fps
  • 比特率:884.4 Kbit / sec
  • 评论:有音频/视频索引(2920字节)
  • MIME类型:video / x-msvideo
  • Endianness:Little endian

是的,在.MP4文件(100fps)上设置了标签

有没有办法从.MP4文件中提取FPS?最好还包括宽度(px),高度(px),持续时间和创建时间。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

好的,我设法提取了我需要的所有数据以及更多! This answer on Stack Overflow让我尝试使用MediaInfo来提取元数据。

为此,我再次切换回Python 3。我还必须将MediaInfoDLL3.py中的第22行更改为MediaInfoDLL_Handler = WinDLL("C:\Program Files (x86)\MediaInfo\MediaInfo_i386.dll")

这是我使用的代码:

import os

os.chdir(os.environ["PROGRAMFILES"] + "\\mediainfo")  # The folder where you installed MediaInfo
from MediaInfoDLL3 import MediaInfo, Stream

MI = MediaInfo()

def get_mediainfo_from(directory):
  for file in os.listdir(directory):
    MI.Open(directory + file)
    file_extension = MI.Get(Stream.General, 0, "FileExtension")
    duration_string = MI.Get(Stream.Video, 0, "Duration/String3")  # Length. "Duration" for ms
    fps_string = MI.Get(Stream.Video, 0, "FrameRate")
    width_string = MI.Get(Stream.Video, 0, "Width")
    height_string = MI.Get(Stream.Video, 0, "Height")
    aspect_ratio_string = MI.Get(Stream.Video, 0, "DisplayAspectRatio")
    frames_string = MI.Get(Stream.Video, 0, "FrameCount")
    local_created_date_string = MI.Get(Stream.General, 0, "File_Created_Date_Local")  # Date of copying
    local_modified_date_string = MI.Get(Stream.General, 0, "File_Modified_Date_Local")  # Date of filming

    if file_extension == "MP4":
      print("Extension: "+file_extension)
      print("Length: "+duration_string)
      print("FPS: "+fps_string)
      print("Width: "+width_string)
      print("Height: "+height_string)
      print("Ratio: "+aspect_ratio_string)
      print("Frames: "+frames_string)
      print("Created Date: "+local_created_date_string)
      print("Modified Date: "+local_modified_date_string)

    else:
      print("{} ain't no MP4 file!".format(file))

    MI.Close()

get_mediainfo_from("C:\\Users\\Nick\\Desktop\\test\\")  # The folder with video files

# print(MI.Option("Info_Parameters"))  # Show list of available metadata tags

这返回:

  • 扩展名:MP4
  • 长度:00:00:37.940
  • FPS:100.000
  • 宽度:1280
  • 身高:960
  • 比率:1.333
  • 框架:3794
  • 创建日期:2015-01-07 15:25:11.678
  • 修改日期:2014-12-13 19:28:14.000

希望这有助于某人!

答案 1 :(得分:1)

这与您解决问题的方式完全不同。我想只获得mp4视频的fps,我通过使用openCV得到它。这不是答案,但我认为这对某人有用。

import cv2
cap = cv2.VideoCapture('name_of_video_file')
fps    = cap.get(cv2.CAP_PROP_FPS)
print 'fps=',fps

您也可以以相同的方式获取其他元数据。例如,

length_of_video = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
width  = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

此网站将为您提供以下关键字:http://docs.opencv.org/3.1.0/dd/de7/group__videoio.html