Подтвердить что ты не робот

IOS потоковое видео и хранение на устройстве впоследствии

До сих пор я знаю, как передавать видео и как его загружать, а потом передавать его, но вот сложный бит: потоковая передача его один раз, сохранение его на устройстве и в будущем воспроизведение его с устройства.

Возможно ли это?

4b9b3361

Ответ 1

Очень легко сохранить видео. Сделайте что-то похожее на это:

//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 *, один раз на каждом шаге.

Ответ 2

Не совсем уверен, как вы получаете свой поток, но смотрите в AVAssetWriter, AVAssetWriterInput и AVAssetWriterPixelBufferAdaptor, и как только вы получите данные, вы сможете добавить данные в адаптер пиксельных буферов, используя:

appendPixelBuffer:withPresentationTime:

не уверен, что это сработает для вас, но с помощью какой-либо игры вы сможете адаптировать свой вход, чтобы соответствовать этому методу. Есть много примеров кода для настройки автора

Ответ 3

Я знаю, чего вы хотите достичь, у меня есть обходной путь. Мне пришлось реализовать одно и то же поведение и в итоге потоковое видео с сервера и загрузить его рядом с потоковой. В следующий раз, когда пользователь попытается передать потоковое видео, определите, была ли она загружена на диск, в противном случае она будет передана снова. В нормальном случае видео было загружено правильно и может быть просмотрено в автономном режиме.

Ответ 4

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.

Ответ 5

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 или видеоплеер в режиме реального времени, независимо от того, что вы используете. Когда вы закончите, актив все равно будет сохранен, чтобы вы могли его получить позже.