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);
}
一切似乎 运行 很好,initerr
和 entererr
返回 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
得到正确的 Handle
和 OSType
然后传递给 NewMovieFromDataRef
.
我正在尝试将 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);
}
一切似乎 运行 很好,initerr
和 entererr
返回 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
得到正确的 Handle
和 OSType
然后传递给 NewMovieFromDataRef
.