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

标签 python video metadata mp4 hachoir-parser

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

我开始使用 Python 3 编写应用程序,但找不到合适的模块来从视频文件中读取元数据。那是我使用 3to2 的时候将整个项目移动到 Python 2,这样我就可以安装 Hachoir-Metadata ,全网好评,使用pip install hach​​oir-corepip install hach​​oir-parserpip install hach​​oir-metadata

我使用了以下代码:

from hachoir_core.error import HachoirError
from hachoir_core.cmd_line import unicodeFilename
from hachoir_parser import createParser
from hachoir_core.tools import makePrintable
from hachoir_metadata import extractMetadata
from hachoir_core.i18n import getTerminalCharset

# Get metadata for video file
def metadata_for(filename):

    filename, realname = unicodeFilename(filename), filename
    parser = createParser(filename, realname)
    if not parser:
        print "Unable to parse file"
        exit(1)
    try:
        metadata = extractMetadata(parser)
    except HachoirError, err:
        print "Metadata extraction error: %s" % unicode(err)
        metadata = None
    if not metadata:
        print "Unable to extract metadata"
        exit(1)

    text = metadata.exportPlaintext()
    charset = getTerminalCharset()
    for line in text:
        print makePrintable(line, charset)

    return metadata

pathname = c:/video.mp4
meta = metadata_for(pathname)
print meta

这返回了以下元数据:

  • 时长:37 秒 940 毫秒
  • 图片宽度:1280 像素
  • 图片高度:960 像素
  • 创建日期:2014-12-13 19:27:36
  • 最后修改时间:2014-12-13 19:27:36
  • 评论:播放速度:100.0%
  • 评论:用户量:100.0%
  • MIME 类型:video/quicktime
  • 字节顺序:大端

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

  • 时长:6 秒 66 毫秒
  • 图片宽度:256 像素
  • 图片高度:240 像素
  • 帧率:30.0 fps
  • 比特率:884.4 Kbit/sec
  • 评论:有音频/视频索引(2920 字节)
  • MIME 类型:视频/x-msvideo
  • 字节顺序:小端

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

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

在此先感谢您的帮助!

最佳答案

好的,我设法提取了我需要的所有数据以及更多! 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
  • 每秒帧数:100.000
  • 宽度:1280
  • 高度:960
  • 比率:1.333
  • 帧数:3794
  • 创建日期:2015-01-07 15:25:11.678
  • 修改日期:2014-12-13 19:28:14.000

希望这对某人有帮助!

关于Python + Hachoir-Metadata - 从 .MP4 文件中读取 FPS 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27850629/

相关文章:

c# - Attribute.IsDefined 看不到应用于 MetadataType 类的属性

app-store - 如何为Couchbase模式建模以存储应用程序特定的元数据?

python - 覆盖测试 Django Rest Framework 的工具

video - 如何存储和流式传输私有(private)视频内容

python - 如何将 pandas Series 对齐到相同的长度?

html - 上传和嵌入在桌面浏览器中播放但不在移动浏览器中播放的视频

python - 在 Python GUI 中嵌入音频、视频

sql - PostgreSQL - 获取数据库元数据的权限

python - 在python中使用默认消息引发内置异常

python - 编写一个脚本来运行带参数的命令