我想打开现有的Movie-File并将此文件的每一帧导出为JPEG或TIFF等图像.到目前为止我到目前为止:
int main(int argc, char* argv[]) {
char filename[255]; // Filename to ping.
OSErr e; // Error return.
FSSpec filespec; // QT file specification
short filemovie; // QT movie handle.
Movie movie; // QT movie "object".
InitializeQTML(0);
EnterMovies();
// Because of QT's Mac origin, must convert C-string filename
// to Pascal counted string, then use that to make a filespec.
c2pstr(filename);
FSMakeFSSpec(0, 0L, (ConstStr255Param)filename, &filespec);
OpenMovieFile(&filespec, &filemovie, fsRdPerm);
NewMovieFromFile(&movie, filemovie, nil, nil, newMovieActive, nil);
...
直到现在它工作正常(我测试了TimeValue movietime = GetMovieDuration(电影);并打印它),但现在我想得到电影的每一帧并将其导出到一个文件(首先,后来我只想保留内存中的数据与它一起工作,但我必须知道它是否真的有效,所以导出到图像文件现在更好).
我怎么做?我需要GWorld或PixMap吗?如何从电影文件中获取GWorld / PixMap,尤其是每一帧?
编辑:我的平台是WinXP
解决方法:
作为一个开始,这篇关于电影出口商的文章应该让你开始:
http://www.mactech.com/articles/mactech/Vol.16/16.05/May00QTToolkit/index.html
即使MacTech是Mac资源,所有描述的API函数也应该在QuickTime for Windows SDK中提供.
一旦找到时间,我会自己将一些示例代码拼凑在一起作为参考.
编辑
有关其他信息,请参阅此书摘录:
QuickTime Toolkit – Basic Movie Playback and Media Types @ Google Books
编辑2 – 高级方法:电影出口商
如果你需要完成的只是从QuickTime影片中提取所有视频帧并将它们转换为QuickTime API支持的另一种格式,那么如果使用电影导出器,则不必采取任何低级操作.
下面的示例代码允许使用以编程方式调用的电影导出对话框将所有视频帧从QuickTime影片提取并转换为一堆JPEG文件.
只需在对话框的“导出”组合框中选择“电影到图像序列”,然后单击“选项”选择所需的图像格式.
注1:如果您需要以非交互方式进行此操作,请告诉我.
注2:为清楚起见,省略了错误处理
#include "Movies.h"
#include "QTML.h"
#pragma comment (lib, "QTMLClient.lib")
…
int flags = createMovieFileDeleteCurFile
| showUserSettingsDialog
| movieToFileOnlyExport;
ItemCount movie_prop_count = 0;
CFStringRef cfpath = 0;
Boolean bool_true = true;
QTNewMoviePropertyElement movie_props[ 2 ];
Movie movie;
// initialize QuickTime API
InitializeQTML( 0 );
EnterMovies();
// set up Core Foundation string for source path (argv[ 1 ]) contains the full path to the MOV file to convert
cfpath = CFStringCreateWithCString( 0, argv[ 1 ], kCFStringEncodingASCII );
movie_props[movie_prop_count].propClass = kQTPropertyClass_DataLocation;
movie_props[movie_prop_count].propID = kQTDataLocationPropertyID_CFStringNativePath;
movie_props[movie_prop_count].propValueSize = sizeof(cfpath);
movie_props[movie_prop_count].propValueAddress = (void*)&cfpath;
movie_props[movie_prop_count].propStatus = 0;
++movie_prop_count;
// make Movie active
movie_props[movie_prop_count].propClass = kQTPropertyClass_NewMovieProperty;
movie_props[movie_prop_count].propID = kQTNewMoviePropertyID_Active;
movie_props[movie_prop_count].propValueSize = sizeof(bool_true);
movie_props[movie_prop_count].propValueAddress = &bool_true;
movie_props[movie_prop_count].propStatus = 0;
++movie_prop_count;
// aquire Movie for our Movie file
NewMovieFromProperties( movie_prop_count, movie_props, 0, 0, &movie );
// invoke conversion dialog
ConvertMovieToFile( movie, 0, 0, 0, 'TVOD', 0, 0, flags, 0 );
// clean up
DisposeMovie( movie );
CFRelease( cfpath );
ExitMovies();
TerminateQTML();
…