是否可以确定媒体文件的持续时间?
当我说媒体(视频)文件时,我指的是以下类型的文件:.wmv,.avi。 .mp4,.flv,.mkv。当我说持续时间时,我的意思是确定视频文件的分钟数和秒数。
我理解每个文件的编码/打包方式不同,但是每个文件可能会在标题中存储它们的持续时间吗?是否有本机WinAPI函数可以允许我将任何这些文件读入内存或至少检查标题?我知道原生WinAPI没有为.png提供任何API函数,因此它也是电影文件的长镜头,但你永远不会知道。
如果原生WinAPI没有能够执行此操作的任何功能,您是否会推荐C ++视频API /库,或者您是否只需打开该文件并手动搜索标题(即使用{{1} })?
答案 0 :(得分:1)
视频中有许多不同的API。我已经研究了一段时间,但是我从谷歌搜索“开源C ++视频库”中找到了这个link
就Windows API而言,它们似乎来去匆匆,所以我个人不会依赖它们。它们也不太可能是便携式的。如果你必须,你可以看看Direct 3D 11之类的东西。我知道游戏的热门选项是Bink。
这些库中的任何一个都应提供您需要的信息,因为许多格式都会在某种标题中包含此信息。
答案 1 :(得分: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;
}