如何确定媒体文件的持续时间?
Posted
技术标签:
【中文标题】如何确定媒体文件的持续时间?【英文标题】:How can I determine the duration of media files? 【发布时间】:2013-03-02 02:15:41 【问题描述】:是否可以确定媒体文件的持续时间?
当我说媒体(视频)文件时,我指的是以下类型的文件:.wmv、.avi。 .mp4、.flv、.mkv。当我说持续时间时,我的意思是确定视频文件的时长(以分钟和秒为单位)。
我了解每个文件的编码/打包方式不同,但也许每个文件都将其持续时间存储在标题中?是否有本机 WinAPI 函数可以让我将这些文件中的任何一个读入内存或至少检查标题?我知道本机 WinAPI 不为 .png 提供任何 API 函数,因此对于电影文件来说这也是一个很长的镜头,但你永远不知道。
如果本机 WinAPI 没有任何功能可以做到这一点,您会推荐一个 C++ 视频 API/库,还是只是打开文件并手动搜索标题的持续时间(即,使用 fopen()
) ?
【问题讨论】:
看一下ffmpeg 大声笑,版主删除胆量 = 你手上有太多时间 【参考方案1】:如果你想使用纯 windows API(就像 windows 浏览器一样),你应该在 propsys.dll 的帮助下完成。
也可以使用 DirectShow 来完成。 像这样:
REFERENCE_TIME GetMediaDuration(CString filePath)
CComPtr<IGraphBuilder> graphBuilder;
if (SUCCEEDED(CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC,
IID_IGraphBuilder, reinterpret_cast<void**>(&graphBuilder))))
CComPtr<IBaseFilter> pSource;
HRESULT hr = graphBuilder->AddSourceFilter(filePath, L"Source", &pSource);
CComPtr<IPin> pPin;
pSource->FindPin(L"Output", &pPin);
if (SUCCEEDED(graphBuilder->Render(pPin)))
CComPtr<IMediaSeeking> mediaSeeking;
hr = graphBuilder->QueryInterface( IID_IMediaSeeking, reinterpret_cast<void**>(&mediaSeeking));
REFERENCE_TIME rtDur = 100;
if (SUCCEEDED(mediaSeeking->GetDuration(&rtDur)))
return rtDur;
return 100;
【讨论】:
【参考方案2】:有许多不同的视频 API。我已经有一段时间没有研究它了,但我从谷歌搜索“开源 C++ 视频库”中找到了这个link
就 Windows API 而言,它们似乎来来去去,所以我个人不会依赖它们。它们也不太可能是便携式的。如果必须,可以查看Direct 3D 11 之类的内容。我知道一个流行的游戏选项是Bink。
这些库中的任何一个都应提供您需要的信息,因为许多格式确实在某种标题中包含此信息。
【讨论】:
“就 Windows API 而言,它们似乎来来去去” - 我不知道曾经有一个 单个 Windows API离开。你想到了哪一个?以上是关于如何确定媒体文件的持续时间?的主要内容,如果未能解决你的问题,请参考以下文章
您如何确定 NAudio 1.7 中的 midi 文件持续时间(以条为单位)?
如何使用 mediainfo 以秒或其他格式查找视频文件的持续时间?