Windows 的 Quicktime 7 API - couldNotResolveDataRef

Quicktime 7 API for Windows - couldNotResolveDataRef

我正在尝试将 Quicktime 7 API 用于 Windows(我知道),因为最终我将尝试更改 Quicktime 文件中的音频通道布局标志,但是对现在我只是想创建一个“电影”对象。

我非常熟悉 Python 和 JavaScript 等语言,但对 C++ 非常陌生。尽管如此,我还是能够将以下代码全部 link 并编译得很好:

#include <iostream>
#include <Movies.h>
#include <QTML.h>


int main()
{
    std::string mystring = "D:/CodingProjects/testfiles/mytestfile.mov";
    OSErr initerr = InitializeQTML(0L);
    OSErr entererr = EnterMovies();

    Movie myMovie;
    short myResID;
    Size mySize = (Size)strlen(mystring.c_str()) + 1;
    Handle myHandle = NewHandleClear(mySize);

    BlockMove(mystring.c_str(), *myHandle, mySize);

    OSErr newmovieerr = NewMovieFromDataRef(&myMovie, 0, &myResID, myHandle, URLDataHandlerSubType);
}

一切似乎 运行 很好,initerrentererr 返回 0,整个程序也以 0 退出。问题出在 NewMovieFromDataRef功能。 newmovieerr 似乎返回代码 -2000 并且没有分配任何东西 (0x00000000) 给 myMovie。查找后,发现此错误代码是 Quicktime 错误,意思是“couldNotResolveDataRef”。

我也尝试使用函数 NewMovieFromHandle 创建 Movie 并得到相同的错误代码。

谁能帮我弄清楚我做错了什么?

任何感兴趣的人。我终于让它可以使用这段代码了。

#include <iostream>
#include <Movies.h>
#include <QTML.h>


int main()
{
    std::string mystring = "D:\CodingProjects\_ffmpeg\test.mov";
    OSErr initerr = InitializeQTML(0L);
    OSErr entererr = EnterMovies();

    CFStringRef inPath = CFStringCreateWithCString(CFAllocatorGetDefault(), mystring.c_str(), CFStringGetSystemEncoding());    

    Movie myMovie;
    short myResID;
    Size mySize = (Size)strlen(mystring.c_str()) + 1;
    Handle myHandle = NewHandle(mySize);
    OSType myDataRefType = NULL;

    OSErr datareferr = QTNewDataReferenceFromFullPathCFString(inPath, kQTWindowsPathStyle, 0, &myHandle, &myDataRefType);
    OSErr newmovieerr = NewMovieFromDataRef(&myMovie, 0, &myResID, myHandle, myDataRefType);

}

其中很大一部分是在路径中使用 \ 而不是 /,并且还使用 CFStringCreateWithCString 得到一个 CFStringRef 传递给 QTNewDataReferenceFromFullPathCFString 得到正确的 HandleOSType 然后传递给 NewMovieFromDataRef.