Потоковое видео iOS и последующее сохранение на устройстве - PullRequest
28 голосов
/ 09 июня 2011

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

Это возможно?

Ответы [ 5 ]

1 голос
/ 16 августа 2011

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

appendPixelBuffer:withPresentationTime:

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

1 голос
/ 12 июля 2011

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

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

0 голосов
/ 23 сентября 2011

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

0 голосов
/ 16 сентября 2011
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:somePath];

и

fileURLWithPath: isDirectory:

Инициализирует и возвращает вновь созданный объект NSURL в виде URL-адреса файла с указанным путем.

+ (id)fileURLWithPath:(NSString *)path isDirectory:(BOOL)isDir

Параметры

путь

Путь, который будет представлять объект NSURL.путь должен быть допустимым системным путем.Если путь начинается с тильды, он должен быть сначала расширен с помощью stringByExpandingTildeInPath.Если путь является относительным путем, он рассматривается как относящийся к текущему рабочему каталогу.Передача nil для этого параметра приводит к исключению.

isDir

Логическое значение, которое указывает, будет ли путь рассматриваться как путь к каталогу при разрешении относительно компонентов относительного пути.Передайте YES, если путь указывает на каталог, иначе NO.Возвращаемое значение NSURL-объект, инициализированный с путем.

Доступность

Доступно в iOS 2.0 и более поздних версиях.

Вы не можете транслировать и сохранять его одновременно, особеннос большими видеофайлами, как утверждает Apple Doc, вы должны использовать транспортный поток для HTTP Live Streaming.

0 голосов
/ 12 сентября 2011

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

...