使用php提取文件元数据

3

现今有许多文件格式(音频、视频、图像、文本)。我希望编写一段PHP代码,可以获取文件的元数据,而不管其格式如何。

要获取基本的元数据(文件名、文件大小、文件类型和上次修改日期),可以使用文件系统API:

<input type="file" id="files" name="files[]" multiple />
<output id="list"></output>

<script>
  function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object

    // files is a FileList of File objects. List some properties.
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
    output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
                 f.size, ' bytes, last modified: ',
                 f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                 '</li>');
    }
    document.getElementById('list').innerHTML = '<ul>' + output.join('') + '</ul>';
  }
  document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>

但是,我希望从文件中提取尽可能多的信息(每个可能的元数据)。

例如:对于一个jpg图像,在提取其元数据时,我可以获取以下内容(使用exif标签):

FILE.FileName: idfo1.jpg 
FILE.FileDateTime: 1369637595 
FILE.FileSize: 126948 
FILE.FileType: 2  
FILE.MimeType: image/jpeg 
FILE.SectionsFound: ANY_TAG, IFD0, EXIF 
COMPUTED.html: width="915" height="1246" 
COMPUTED.Height: 1246 
COMPUTED.Width: 915 
COMPUTED.IsColor: 1 
COMPUTED.ByteOrderMotorola: 1 
COMPUTED.ApertureFNumber: f/2.6 
COMPUTED.UserComment:  
IFD0.ImageWidth: 2048 
IFD0.ImageLength: 1536 
IFD0.Make: SAMSUNG 
IFD0.Model: GT-S5830 
IFD0.Software: S5830DXKPD 
IFD0.DateTime: 2012:06:06 10:18:24 
IFD0.YCbCrPositioning: 1 
IFD0.Exif_IFD_Pointer: 2232 
IFD0.UndefinedTag:0xEA1C: ê 
EXIF.ExposureTime: 1/229 
EXIF.FNumber: 26/10 
EXIF.ExposureProgram: 3 
EXIF.ISOSpeedRatings: 50 
EXIF.ExifVersion: 0220 
EXIF.DateTimeOriginal: 2012:06:06 10:18:24 
EXIF.DateTimeDigitized: 2012:06:06 10:18:24    
EXIF.MaxApertureValue: 30/10 
EXIF.MeteringMode: 3 
EXIF.Flash: 0 
EXIF.FocalLength: 355/100 
EXIF.UserComment:  
EXIF.ColorSpace: 1 
EXIF.ExifImageWidth: 2048 
EXIF.ExifImageLength: 1536 
EXIF.ExposureMode: 0 
EXIF.WhiteBalance: 0 
EXIF.SceneCaptureType: 0 
EXIF.UndefinedTag:0xEA1C: ê

如果可能的话,我希望能获取地理标记数据。类似地,对于视频和音频文件类型,我希望能获取以下信息:
- 比特率(音频和视频) - 时长 - 文件创建日期 - 注释 - 帧尺寸等
是否有任何可以直接为我完成此操作的 PHP 或 JavaScript 代码?
2个回答

2

有一个名为getid3()的类,适用于许多媒体类型。使用起来非常简单而且功能强大,可以读取和写入文件的元数据。

还有一些JavaScript类可以从文件中读取元数据,例如exif、id3等。

搜索“使用JavaScript读取exif数据”或“JavaScript ID3 Reader”。

如果您拥有自己的服务器,还可以使用一些命令行工具(通过php执行)来读取exif、id3标签以及新的mp4标签,如atomicparsley。

以下是您可以使用getid3和php完成的一些操作:

Tag formats:
ID3v1 (v1.0 & v1.1)
ID3v2 (v2.2, v2.3 & v2.4)
APE tags (v1 & v2)
(Ogg) VorbisComment
Lyrics3 (v1 & v2)
IDivX
Lossy Audio-only formats:
MP3, MP2, MP1 (MPEG-1, layer III/II/I audio, including Fraunhofer, Xing and LAME VBR/CBR headers)
Ogg Vorbis
Musepack (versions SV4-SV8)
AAC & MP4
AC-3
DTS (including DTS-in-WAV)
RealAudio
VQF
Speex
Digital Speech Standard (DSS)
Audible Audiobooks
Lossless Audio-only formats:
WAV (including extended chunks such as BWF and CART)
AIFF
Monkey's Audio
FLAC & OggFLAC
LA (Lossless Audio)
OptimFROG
WavPack
TTA
LPAC (Lossless Predictive Audio Compressor)
Bonk
LiteWave
Shorten
RKAU
Apple Lossless Audio Codec
RealAudio Lossless
CD-audio (*.cda)
NeXT/Sun .au
Creative .voc
AVR (Audio Visual Research)
MIDI
Audio-Video formats:
AVI
Matroska (WebM)
ASF (ASF, Windows Media Audio (WMA), Windows Media Video (WMV))
MPEG-1 & MPEG-2
Quicktime (including MP4)
RealVideo
NSV (Nullsoft Streaming Video)
Graphic formats:
JPEG
PNG
GIF
BMP (Windows & OS/2)
TIFF
SWF (Flash)
PhotoCD
Data formats:
ZIP
TAR
GZIP
ISO 9660 (CD-ROM image)
CUEsheets (.cue)
SZIP
Metadata types:
EXIF (Exchangeable image file format)
IPTC
XMP (Adobe Extensible Metadata Platform)
Formats identified, but not parsed:
PDF
RAR
MS Office (.doc, .xls, etc)

有必要绝对使用 PHP 来完成这项工作吗?JavaScript 能完全胜任吗? - Shubham Lalwani
搜索“使用JavaScript读取exif数据”或“JavaScript ID3 Reader”。JavaScript是客户端脚本...因此很难读取大文件...但是您可以使用这些JavaScript类执行非常好的简单操作...我用于我的数码单反相机以获取ISO,光圈,焦距和其他重要信息...我认为您也可以获取地理位置。使用mp3类,您可以读取大多数信息,包括封面。 - cocco
它不像使用PHP类或直接在服务器上使用PHP命令行那样稳定。在我看来,最好的方法是使用命令行工具,并在上传文件后将收集的信息保存到MySQL数据库或JSON文件中。 - cocco

1
不,这种东西不存在!因为有成千上万种音频和视频格式、不同的编解码器、不同的压缩模式等。你必须为每个格式编写自己的代码。

例如,基于使用的编解码器,视频AVI文件可能包含许多不同的元数据 - 这取决于编解码器(有数百种)。

你可能需要很多经验和几个月的编码和测试,但肯定没有快速解决方案。

你可能可以找到一些基本工具,但没有任何东西可以在你使用的每种文件类型中找到每一个可行的事情

如果我错了,而你能找到一些库来做到这一点,请分享,但逻辑告诉我们,你想要的东西是不存在的。


有必要绝对使用 PHP 来完成这项工作吗?JavaScript 能完全胜任吗? - Shubham Lalwani
这不是 JavaScript 的目的。虽然可能有可能,但不要忘记你的脚本必须检查本地机器上的文件或下载并检查它。在线实现是不可能的。另一个问题是它可能会是一个巨大的脚本,这意味着用户每次请求服务器时都必须下载它以及你的页面。这可能会引起一些严重的问题。理论上是可能的,但在现实生活中,你可能不想要那种头疼的工作 - 简而言之,这是一个永无止境的工作。 - Wh1T3h4Ck5
我很好奇,你为什么需要那么多的信息?试着更新你的问题,并提供更相关的描述和代码用途。也许有人可以建议一些你可以用来解决问题的东西。 - Wh1T3h4Ck5
谢谢!实际上我正在构建一个Web API,用于分析数据并提取其元数据,因为在未来,元数据将会变得非常重要。 - Shubham Lalwani
无论你做什么,不要在这个目的上使用JavaScript... 你需要服务端脚本语言,比如PHP,来尽可能快地完成任务。JavaScript只是客户端帮助改善和更加用户友好的界面(并且可能会被客户端禁用)。 - Wh1T3h4Ck5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接