查找远程媒体文件的视频分辨率和视频时长

Posted

技术标签:

【中文标题】查找远程媒体文件的视频分辨率和视频时长【英文标题】:Find video resolution and video duration of remote mediafile 【发布时间】:2012-01-22 04:36:28 【问题描述】:

我想写一个程序,可以找到一些媒体文件的元信息。我对流行的视频格式感兴趣,例如 avi、mkv、mp4、mov(也可能是其他流行的)。我想基本上得到:

视频尺寸(720、1080、360 等) 视频的总运行时间(可能不太准确) 音频流数 视频编解码器的名称 音频编解码器的名称

已经有mediainfo,但是在我的程序中我想获取远程文件的信息,可以通过ftp、http、samba访问;甚至是 torrent(有一些 torrent 解决方案,可以读取尚未下载的文件)。

MediaInfo 库不支持 samba (smb://) 和 mkv 格式(用于运行时)。

另外,我想知道,应该下载多少数据才能获取此信息。我不想下载完整的视频文件,因为我没有足够的磁盘空间。

此信息是否在文件的前 1、10 或 100 KB 中?如果我知道容器名称和总文件大小,它是否处于可预测的偏移量?

PS:平台是Linux,语言是C/C++

【问题讨论】:

2020年这里有解决这个问题的办法吗? 【参考方案1】:

不,您无法从文件的“前 X 个字节”(对于小于媒体文件完整大小的任何已知 X 值)中找到您要查找的信息。一些容器在标题中列出了所有这些信息。有些(如 QuickTime)在文件末尾具有元数据,并且在标头中具有元数据偏移量。一些(如 AVI)在标头中列出流偏移,在每个流的标头中包含特定的流信息(即,分散在整个文件中)。有些根据编码方法使用不同的样式(例如,快速流式传输与即时编码)。

也就是说,理论上可以通过请求适当的字节范围来完成您正在寻找的事情。例如,请求前 10K 左右,并根据容器类型解析出您需要读取/解析的其他字节范围以查找元数据。但这将是一个相当大的项目。

【讨论】:

以上问题是关于编写程序的。但是,我很想知道在上传视频文件之前是否有任何可用的库可以告诉分辨率、比特率和持续时间?我遇到过 xuggler 、 MediaInfo 等库。这些库只有在视频上传完成后才能提供信息。【参考方案2】:

取决于容器格式,avi / mp4 / mkv

看源码到http://mediainfo.sourceforge.net/en

【讨论】:

已经在这里了。链接已经在原帖中。正如我从mediainfo.sourceforge.net/en/Support/Formats 看到的那样——mediainfo 无法从 mkv 获得持续时间; mediainfo 也无法从 'smb://' 协议读取文件(libcurl 不支持) @osgx - 一些较新的更复杂的容器,如 mkv 可以包含具有不同编解码器的不同分辨率的多个文件,但实际上很少见 - 通常最简单的解决方案就可以了。【参考方案3】:

在一般情况下根本无法判断。这一切都取决于远程文件的容器格式,即便如此,您可能需要跳过很多环节才能从 50% 的文件中获取所有元数据。将自己限制在 ISO 媒体(QuickTime、MPEG-4、3GPP 等)上,您可以获得更高的命中率,但即便如此也不是很明显。

【讨论】:

是否可以解析前 1 MB 的文件以获得偏移量?我需要支持最流行的视频格式:avi、mkv、mpeg;编解码器 x264、mpeg4。 或者是否可以说“我需要下载不超过 X MB”来获取我想要的所有元信息?

以上是关于查找远程媒体文件的视频分辨率和视频时长的主要内容,如果未能解决你的问题,请参考以下文章

解析视频分辨率和时长

解析视频分辨率和时长

选择本地视频时获取视频分辨率和时长

获取视频文件格式信息的工具和方法

[FFMPEG-CLI]合并不同分辨率/帧率视频注意事项-出现合并后时长问题

视频帧速率影响清晰度吗