1

我正在使用 NSDocument 架构的应用程序中对 QTMovie 进行少量编辑(例如添加轨道,如下所示)。编辑后,我想保存到原始文件。但是,我不断收到“文件正忙”错误。我认为这是由于我在处理文件时的一些疏忽,或者我使用 NSDocument 的方式失败。任何提示都会有所帮助!这是(一些)相关代码:

// open file that has the track I want to add to my movie
QTMovie* tempMovie = [QTMovie movieWithURL:outputFileURL error:nil];

// Use old API to add the track 
AddMovieSelection([movie quickTimeMovie], [tempMovie quickTimeMovie]);

// get the filename from the NSDocument
NSString *filename = [[self fileURL] path];
NSLog(@"writing to filename: %@", filename);

// FLATTEN the movie file so I don't get external references
NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithCapacity:1];
[attributes setObject:[NSNumber numberWithBool:YES] forKey:QTMovieFlatten];

// attempt to write
NSError *error;
//  this is where I get the "file is busy"
if (![movie writeToFile:filename withAttributes:attributes error:&error]) {
    NSLog(@"Error: %@", [error localizedDescription]);
    NSRunAlertPanel(@"Error", [error localizedDescription], nil, nil, nil);
}    

我必须先在我的 NSDocument 中发布电影吗?这样做的“正确”方法是什么?请记住,我不一定完成此文档,我不会关闭它。我刚刚完成了这个操作,我希望磁盘上的文件能够反映我的更改。我很想使用 [movie updateMovieFile],但该调用似乎并没有使电影变平。我不希望我的文件中有任何外部引用。

4

2 回答 2

0

我对 QuickTime C API 不太熟悉,所以老实说,我无法告诉您那里出了什么问题。绝对的猜测:也许EndMediaEdits缺少一个电话?
虽然这不应该是 的要求AddMovieSelection,但您说“[...]例如添加轨道 [...]”。所以也许还有其他事情发生,比如AddMediaSample或类似的事情?

也就是说,如果您不需要针对低于 10.5 的任何内容,并且您需要做的只是从另一部电影中添加一些片段,那么您可以在不使用 C API 的情况下实现这一目标:

看一下

我必须先在我的 NSDocument 中发布电影吗?

你的意思是为了把它写到磁盘上?否:这甚至会导致崩溃。

的作用release是处理内存管理。它与文件的忙碌状态没有太大关系。

于 2011-02-11T23:19:42.527 回答
0

原来我只是没有正确使用 NSDocument 架构。当我将其更改为正确使用 Save/SaveAs 时,这个问题就消失了。

于 2011-03-15T14:57:39.597 回答