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"

strftimeisnteadを使用してみてください

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 に答える