Лучший способ для потокового видео
В настоящее время я использую AVFoundation
чтобы захватить кадры с камеры iPhone, а затем превратить их в UIImage
тогда я перевожу его через NSOutputStream
Я отправляю его на другое устройство.
К сожалению, я получаю сбои, скорее всего, из-за слишком большой памяти, так как в один момент она достигает 300 МБ.
Мой вопрос: есть ли лучший способ сделать это или какой-нибудь другой метод, который позволил бы остановить его сбой или иметь меньшую задержку между отправкой изображения по сравнению с получением изображения на другом устройстве? Или я могу сделать это как жизнепоток, где это почти как видео на приемном устройстве?
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
@autoreleasepool {
UIImage *image = [self imageFromSampleBuffer:sampleBuffer];
[_room broadcastChatMessage:image fromUser:@"self"];
dispatch_async(dispatch_get_main_queue(), ^(void){
[_imgView setImage:image];
});
}
// < Add your code here that uses the image >
}
1 ответ
Один из лучших вариантов потоковой передачи видео с устройства iOS - это запись видео H264 и извлечение блоков NAL (они представляют кусочки кадров) из файла фильма на диске (с использованием AVFoundation
) и отправьте их по сети, используя выбранный вами протокол. Вы можете увидеть пример этого в действии на https://github.com/jamesghurley/VideoCore/blob/master/transforms/iOS/H264Encode.mm. Задержка довольно низкая, используя эту технику.
Однако воспроизвести этот контент на другом устройстве iOS... сложно. Вы можете использовать FFMpeg для воспроизведения в режиме реального времени или, если вы можете принять некоторую задержку (3-4 секунды), вы можете настроить HTTP-прокси и обслуживать блоки NAL через HLS. Это также сложная процедура, но для этого может быть доступна библиотека.
РЕДАКТИРОВАТЬ: Обновление этого ответа немного. В iOS 8 теперь есть класс AVSampleBufferDisplayLayer
который может принимать H.264 NAL-единицы напрямую в качестве входных данных.