Как хранить видео на iPhone при публикации видео с помощью RTMPStreamPublisher?

Сейчас я использую RTMPStreamPublisher для публикации видео на wowzaserver. Он загружается там успешно, но может ли кто-нибудь сказать мне, как я могу сохранить одно и то же видео на iPhone при загрузке на сервер?

Я использую https://github.com/slavavdovichenko/MediaLibDemos, но доступной документации недостаточно. Если я могу просто сохранить данные, отправленные для публикации, то моя работа будет успешной.

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

// ACTIONS

-(void)doConnect {
#if 0 // use ffmpeg rtmp 
    NSString *url = [NSString stringWithFormat:@"%@/%@", hostTextField.text, streamTextField.text];
    upstream = [[BroadcastStreamClient alloc] init:url  resolution:RESOLUTION_LOW];
    upstream.delegate = self;
    upstream.encoder = [MPMediaEncoder new];
    [upstream start];
    socket = [[RTMPClient alloc] init:host]
    btnConnect.title = @"Disconnect";     
    return;
#endif

#if 0 // use inside RTMPClient instance
    upstream = [[BroadcastStreamClient alloc] init:hostTextField.text resolution:RESOLUTION_LOW];
    //upstream = [[BroadcastStreamClient alloc] initOnlyAudio:hostTextField.text];
    //upstream = [[BroadcastStreamClient alloc] initOnlyVideo:hostTextField.text resolution:RESOLUTION_LOW];

#else // use outside RTMPClient instance

    if (!socket) {
        socket = [[RTMPClient alloc] init:hostTextField.text];
        if (!socket) {
            [self showAlert:@"Socket has not be created"];
            return;
        }
        [socket spawnSocketThread];
   }
    upstream = [[BroadcastStreamClient alloc] initWithClient:socket resolution:RESOLUTION_LOW];
#endif

    [upstream setVideoOrientation:AVCaptureVideoOrientationLandscapeRight];
    //[upstream setVideoOrientation:AVCaptureVideoOrientationLandscapeLeft];
    //[upstream setVideoBitrate:512000];
    upstream.delegate = self;
    [upstream stream:streamTextField.text publishType:PUBLISH_LIVE];
    //[upstream stream:streamTextField.text publishType:PUBLISH_RECORD];
    //[upstream stream:streamTextField.text publishType:PUBLISH_APPEND];
    btnConnect.title = @"Disconnect";     
}

Я нашел, что с экземпляром BroadcastStreamClient, названным как "вверх по течению", я могу получить AVCaptureSession через следующую строку

[upstream getCaptureSession];

Как я могу использовать этот AVCaptureSession для записи видео на iPhone?

Ответы

Ответ 1

Как только вы получили AVCaptureSession, вы можете добавить к нему экземпляр AVCaptureMovieFileOutput следующим образом:

AVCaptureMovieFileOutput *movieFileOutput = [AVCaptureMovieFileOutput new];
if([captureSession canAddOutput:movieFileOutput]){
    [captureSession addOutput:movieFileOutput];
}

// Start recording
NSURL *outputURL = …
[movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self];

Источник: https://www.objc.io/issues/23-video/capturing-video/

Также взгляните на это, чтобы лучше понять, как использовать AVCaptureFileOutput: https://developer.apple.com/library/mac/documentation/AVFoundation/Reference/AVCaptureFileOutput_Class/index.html#//apple_ref/occ/cl/AVCaptureFileOutput

Ответ 2

Попробуйте это, когда вы выбрали видео из фотоальбома или записали. или в методе didFinishPickingMediaWithInfo

NSURL __block *videoUrl=(NSURL*)[info objectForKey:UIImagePickerControllerMediaURL];

NSString *moviePath = [videoUrl path];

if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum (moviePath)) {
             UISaveVideoAtPathToSavedPhotosAlbum (moviePath, nil, nil, nil);
 }

Ответ 3

Вы можете кэшировать видео с помощью NSKeyedArchiver, если ваш объект соответствует протоколу <NSCoding> (многие типы коллекций уже соответствуют этому). Этот каталог кэша периодически очищается

http://khanlou.com/2015/07/cache-me-if-you-can/

Или, может быть, лучшей альтернативой может быть использование NSTemporaryDirectory() для хранения вашего временного видеофайла (это часть NSPathUtilities) локально. AVAssetExportSession должен предоставить вам видеофайл:

AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetMediumQuality];
exportSession.outputURL = outputFileURL;