До сих пор я знаю, как передавать видео и как его загружать, а потом передавать его, но вот сложный бит: потоковая передача его один раз, сохранение его на устройстве и в будущем воспроизведение его с устройства.
Возможно ли это?
До сих пор я знаю, как передавать видео и как его загружать, а потом передавать его, но вот сложный бит: потоковая передача его один раз, сохранение его на устройстве и в будущем воспроизведение его с устройства.
Возможно ли это?
Очень легко сохранить видео. Сделайте что-то похожее на это:
//Saving Movie
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:*MovieObject* forKey:@"MovieObjectDataKey"];
[archiver finishEncoding];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"MovieObjectDefaultsDataKey"];
[archiver release];
[data release];
//Retrieving movie
NSData *savedMovieData = [[NSUserDefaults standardUserDefaults] objectForKey:@"MovieObjectDefaultsDataKey"];
if (savedMovieData != nil) {
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:savedMovieData];
*MovieObject* = [[unarchiver decodeObjectForKey:@"MovieObjectDataKey"] retain];
[unarchiver finishDecoding];
[savedMovieData release];
[unarchiver release];
} else {
//Download Stream of Your Movie
}
Единственное, что вам действительно нужно изменить, - это * MovieObject *, один раз на каждом шаге.
Не совсем уверен, как вы получаете свой поток, но смотрите в AVAssetWriter, AVAssetWriterInput и AVAssetWriterPixelBufferAdaptor, и как только вы получите данные, вы сможете добавить данные в адаптер пиксельных буферов, используя:
appendPixelBuffer:withPresentationTime:
не уверен, что это сработает для вас, но с помощью какой-либо игры вы сможете адаптировать свой вход, чтобы соответствовать этому методу. Есть много примеров кода для настройки автора
Я знаю, чего вы хотите достичь, у меня есть обходной путь. Мне пришлось реализовать одно и то же поведение и в итоге потоковое видео с сервера и загрузить его рядом с потоковой. В следующий раз, когда пользователь попытается передать потоковое видео, определите, была ли она загружена на диск, в противном случае она будет передана снова. В нормальном случае видео было загружено правильно и может быть просмотрено в автономном режиме.
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:somePath];
и
fileURLWithPath: isDirectory:
Инициализирует и возвращает вновь созданный объект NSURL в качестве URL-адреса файла с указанным путем.
+ (id)fileURLWithPath:(NSString *)path isDirectory:(BOOL)isDir
Параметры
путь
Путь, который будет представлять объект NSURL. путь должен быть допустимым системным путем. Если путь начинается с тильды, он должен быть сначала расширен с помощью stringByExpandingTildeInPath. Если путь является относительным путем, он рассматривается как относящийся к текущему рабочему каталогу. Передача nil для этого параметра создает исключение.
isDir
Логическое значение, указывающее, рассматривается ли путь как путь к каталогу при разрешении относительно относительных компонентов пути. Передайте YES, если путь указывает каталог, в противном случае - нет. Возвращаемое значение Объект NSURL, инициализированный с помощью пути.
Наличие
Доступен в iOS 2.0 и более поздних версиях.
Вы не можете передавать его и сохранять в одно и то же время, особенно с большими видеофайлами в качестве документов Apple, которые должны использовать транспортный поток для потоковой передачи HTTP.
ASIHttpRequest может облегчить вашу жизнь.
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadDestinationPath:@"video.m4v"]; // use [NSBundle mainBundle] to find a better place
От вашего делегата справитесь с этим:
- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data;
Выполняйте любые транскодирование данных с помощью data
, когда вы его получите, и отпустите его на свой уровень AVAssetWriter
или видеоплеер в режиме реального времени, независимо от того, что вы используете. Когда вы закончите, актив все равно будет сохранен, чтобы вы могли его получить позже.