0

我有一个使用 Direct-show 抓取视频的程序。我的问题是我希望保存的视频以时间作为名称。这是我所做的:

CoInitialize(NULL);
CComPtr<IGraphBuilder> graph;
graph.CoCreateInstance(CLSID_FilterGraph);
time_t rawtime;
struct tm * timeinfo;
time (&rawtime);
timeinfo = localtime (&rawtime);
wchar_t pathstuff[50];
swprintf(pathstuff, L"D:\\BMDvideos\\%hs.avi", asctime(timeinfo));
LPCOLESTR x = pathstuff;
HRESULT hr = BuilGraph(graph,x);
..........

这不起作用,知道我该怎么做吗?

4

3 回答 3

3

格式化时间的函数是strftime,所以你可以这样做:

char filename[1000];
size_t l = strftime( filename,
                     sizeof(filename),
                     "D:/BMDvideos/%Y-%m-%dT%Hh%Mm%S.avi",
                     timeinfo );
assert( l != 0 );

几条评论:

  • 想要宽字符文件名。它们不是标准的,也没有得到广泛支持。(Unicode 文件名的通用标准是 UTF-8,它适用于任何地方。事实上,您不希望在程序之外的任何地方使用宽字符。)

  • 您不能使用任何标准格式化函数,例如 asctime,因为它们几乎肯定会':'在时间格式中使用冒号 ( ),并且冒号是 Windows 下文件名中的非法字符。您必须自己指定确切的格式,使用strftime.

  • 您可能还应该避免使用许多其他字符。我倾向于将我的文件名限制为字母数字、下划线、连字符和点,而且我不太确定连字符的可移植性,或者带有多个点的名称。如果名称不是供人类使用的,我只会使用 "%Y%m%d%H%M%S",没有分隔符。

  • 最后,对日期使用 ISO 排序(年、月、日)很有用,因为这意味着字典排序对应于日期排序。

编辑:

既然你说你必须使用wchar_t文件名(这是一个非常糟糕的策略):你仍然可以使用上面的来生成文件名,然后std::wstring通过简单地使用 std::wstring( filename, filename + strlen( filename ) ).

于 2013-02-25T09:28:24.233 回答
1

asctime 在返回的字符串末尾添加'\n'字符,这对于文件名无效

调用 ctime(t) 等价于 asctime(localtime(t))。它将日历时间 t 转换为形式为 null 的字符串

          "Wed Jun 30 21:49:08 1993\n"

尝试使用 strftime istead

char name[100]
strftime(name, 100, "%F_%R", timeinfo);
于 2013-02-25T09:35:34.380 回答
1

wchar_t *并且LPCOLESTR在运行时不是兼容的类型。你读过这本 BSTR 手册吗?它将告诉您如何正确分配 BSTR。

于 2013-02-25T09:55:21.640 回答