Я пока не использую iOS 4.3 SDK, но мне было бы интересно узнать значение mediaAsset.exportable для 4.3, как описано здесь:
http://developer.apple.com/library/ios/#releasenotes/AudioVideo/RN-AVFoundation/_index.html#//apple_ref/doc/uid/TP40010717-CH1-SW4
Я пробовал несколько модификаций вашего кода, таких как получение имени предустановки и типа файла из списка доступных, но я получаю ту же ошибку, что и вы.
Итак, я решил попробовать низкоуровневую инфраструктуру, поскольку в документации говорится, что вы можете подключить AVAssetReader и AVAssetWriter, чтобы получить тот же эффект, что и AVAssetExportSession, но с большим контролем. Однако следующий код:
NSError *readerError = nil;
AVAssetReader *reader =
[AVAssetReader assetReaderWithAsset:mediaAsset error:&readerError];
if (readerError) NSLog(@"Error instantiating asset reader: %@",
[readerError localizedDescription]);
Дает следующий вывод:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '*** -[AVAssetReader initWithAsset:error:] Cannot initialize an instance of
AVAssetReader with an asset at non-local URL 'http://example.com/test.mp3''
Обратите внимание, что я проверил это с рабочим URL, но заменил его на поддельный выше. Мне кажется, что iOS не поддерживает функциональность, которую мы ищем. Насколько я знаю, AVAssetExportSession использует AVAssetReader под капотом и просто сообщает о гораздо менее описательной ошибке при сбое. Было бы неплохо, если бы они просто документировали это. В документах для AVAssetExportSession ничего не говорится о том, что актив должен быть локальным:
http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAssetExportSession_Class/Reference/Reference.html#//apple_ref/occ/cl/AVAssetExportSession
Я знаю, что это не очень хороший ответ, но он немного продвигает расследование. Я все еще очень надеюсь, что есть какой-то способ сделать это, потому что, очевидно, мы не одиноки в желании этой функции.