2011-02-09 3 views
1

Я делаю небольшие изменения для QTMovie в приложении с использованием архитектуры NSDocument (например, добавление трека, как показано ниже). После редактирования я хочу сохранить исходный файл. Тем не менее, я все время получаю ошибку «файл занят». Я предполагаю, что это связано с некоторым недосмотром, которое я сделал при обработке файлов, или с отказом от использования NSDocument. Любые советы были бы полезны! Вот (некоторые из) соответствующего кода:Как правильно сохранить QTMovie после редактирования с помощью QTKit?

// 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], но этот звонок, похоже, не сглаживает фильм. Мне не нужны внешние ссылки в моем файле.

ответ

0

Оказывается, я просто не использовал архитектуру NSDocument должным образом. Когда я изменил его, чтобы правильно использовать Save/SaveAs, эта проблема исчезла.

0

Я не очень хорошо знаком с API QuickTime C, поэтому, честно говоря, я ничего не могу сказать о том, что там происходит. Абсолютная догадка: Возможно, звонок в EndMediaEdits отсутствует?
Хотя это не должно требоваться AddMovieSelection, вы сказали «[...] , например, добавив трек [...]». Так что, может быть, происходит что-то еще, например AddMediaSample или что-то подобное?

Тем не менее, если вам не нужно что-либо ниже 10,5 цели и все, что вам нужно сделать, это добавить некоторый отрезок из другого фильма, вы можете добиться того, что не опускаясь к C API:

Имеют посмотреть на

Должен ли я сначала снимать фильм в своем NSDocument?

Вы имеете в виду , чтобы написать его на диск? Нет. Это должно привести к краху.

Роль release - это управление памятью. Это не имеет большого отношения к загруженному состоянию файла.