我在 Python 中编写Windows应用程序,该应用程序必须从 .MP4 视频文件中读取元数据。
我开始在Python 3中编写应用程序,但无法找到合适的模块来读取视频文件中的元数据。当我使用3to2将整个项目移动到Python 2时,我可以使用pip install hachoir-core
安装Hachoir-Metadata,这在整个网络中受到称赞,{{1} }和pip install hachoir-parser
我使用了以下代码:
pip install hachoir-metadata
这返回了以下元数据:
这很棒,除了我真的需要知道每秒帧数(FPS)。对于.AVI文件,Hachoir-Metadata确实显示了FPS,正如您可以从此测试输出中看到的那样:
是的,在.MP4文件(100fps)上设置了标签。
有没有办法从.MP4文件中提取FPS?最好还包括宽度(px),高度(px),持续时间和创建时间。
提前感谢您的帮助!
答案 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
这返回:
希望这有助于某人!
答案 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