Как хранить видео на 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;