Лучший способ для потокового видео

В настоящее время я использую 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-единицы напрямую в качестве входных данных.

Другие вопросы по тегам