gpt4 book ai didi

c++ - 如何确定媒体文件的持续时间?

转载 作者:行者123 更新时间:2023-11-28 03:22:01 25 4
gpt4 key购买 nike

是否可以确定媒体文件的持续时间?

当我说媒体(视频)文件时,我指的是以下类型的文件:.wmv、.avi。 .mp4、.flv、.mkv。当我说持续时间时,我的意思是确定视频文件的时长(分钟和秒)。

我知道每个文件的编码/打包方式不同,但也许每个文件都将它们的持续时间存储在 header 中?是否有 native WinAPI 函数可以让我将这些文件中的任何一个读入内存或至少检查标题?我知道 native WinAPI 不为 .png 提供任何 API 函数,因此电影文件也不太可能,但你永远不会知道。

如果 native WinAPI 没有任何功能可以做到这一点,你会推荐一个 C++ 视频 API/库,还是你会打开文件并手动搜索标题的持续时间(即,使用 fopen ())?

最佳答案

如果您想使用纯 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;
}

关于c++ - 如何确定媒体文件的持续时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15169944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com