我正在用Python编写一个Windows应用程序,它必须从.MP4视频文件中读取元数据。
我开始用Python 3编写应用程序,但找不到合适的模块从视频文件中读取元数据。这就是我使用3至2将整个项目转移到Python2的时候,这样我就可以使用pip install hachoir-core、pip install hachoir-parser和pip install hachoir-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这将返回以下元数据:
这很好,除了我真的需要知道每秒的帧(FPS)。对于.AVI文件,Hachoir元数据确实显示了FPS,从这个测试输出可以看到:
是的,FPS标记是在.MP4文件(100 FPS)上设置的。
有从.MP4文件中提取FPS的方法吗?最好包括宽度(Px)、高度(Px)、持续时间和创建时间。
提前感谢您的帮助!
发布于 2015-01-09 11:19:25
好的,我成功地提取了我需要的所有数据,还有更多!堆栈溢出的这个答案给了我一个想法,尝试使用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这是归还的:
希望这能帮到别人!
发布于 2016-11-10 11:23:00
这与你处理这个问题的方式完全不同。我只想得到一个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))本网站将帮助您使用关键字:videoio.html
https://stackoverflow.com/questions/27850629
复制相似问题