Поток веб-камеры с FFMpeg на iPhone - PullRequest
1 голос
/ 07 июня 2011

Я пытаюсь отправить и показать поток веб-камеры с сервера linux в приложение для iPhone.Я не знаю, является ли это лучшим решением, но я скачал и установил FFMpeg на сервере Linux (далее, для тех, кто хочет знать, этот учебник).FFMpeg работает нормально.После многих странствий мне удалось отправить поток клиенту, запустив

ffmpeg  -s 320x240 -f video4linux2 -i /dev/video0 -f mpegts -vcodec libx264 udp://192.168.1.34:1234

, где 192.168.1.34 - адрес клиента.На самом деле клиент - это Mac, но это должен быть iPhone.Я знаю, что поток отправляется и принимается правильно (проверено по-разному).
Однако мне не удалось просмотреть поток непосредственно на iPhone.
Я подумал о различных (возможных) решениях:

  • первое решение: хранить входящие данные вNSMutableData объект.Затем, когда поток заканчивается, сохраните его и затем воспроизведите, используя MPMoviePlayerController.Вот код:

    [video writeToFile:@"videoStream.m4v" atomically:YES];
    NSURL *url = [NSURL fileURLWithPath:@"videoStream.m4v"];
    
    MPMoviePlayerController *videoController = [[MPMoviePlayerController alloc] initWithContentURL:url];
    
    [videoController.view setFrame:CGRectMake(100, 100, 150, 150)];
    
    [self.view addSubview:videoController.view];
    
    [videoController play];
    

    проблема этого решения заключается в том, что ничего не воспроизводится (я вижу только черный квадрат), даже если видео сохранено правильно (я могу воспроизвести его непосредственно со своего диска с помощью VLC).Кроме того, это не очень хорошая идея.Это просто для того, чтобы все заработало.

  • Второе решение: используйте CMSampleBufferRef для хранения входящего видео.С этим решением связано гораздо больше проблем: во-первых, в моей системе нет CoreMedia.framework.Кроме того, я не понимаю, что представляет этот класс и что я должен сделать, чтобы он работал: я имею в виду, если я начну (каким-то образом) заполнять этот «SampleBuffer» байтами, которые я получаю от соединения UDP, тогда он автоматически вызовет CMSampleBufferMakeDataReadyCallback Функция, которую я установил при создании?Если да, то когда?Когда один кадр завершен или когда весь поток получен?

  • Третье решение: использовать AVFoundation framework (на самом деле это не доступно на моем Mac).Я не понял, возможно ли вообще начать запись с удаленного источника или даже с NSMutableData, char* или чего-то в этом роде.На AVFoundation Programming Guide я не нашел ни одной ссылки, в которой говорилось бы, возможно это или нет.


Я не знаю, какое из этих решений лучше для моих целей.ЛЮБОЕ предложение будет оценено.


Кроме того, есть еще одна проблема: я не использовал программу для сегментирования для отправки видео.Теперь, если я не ошибаюсь, segmenter нужно разделить исходное видео на более мелкое / короткое видео, чтобы его легче было отправлять.Если это правильно, то, возможно, не обязательно, чтобы все работало (может быть добавлено позже).Однако, так как сервер работает под Linux, я не могу использовать mediastreamsegmeter от Apple.Кто-нибудь может предложить использовать сегментатор с открытым исходным кодом в сочетании с FFMpeg?


ОБНОВЛЕНИЕ: я отредактировал свой вопрос, добавив больше информации о том, что я сделал с тех пор, и в чем мои сомнения.

Ответы [ 4 ]

1 голос
/ 06 декабря 2011

Карсон Макдональд реализовал отличное решение для потоковой передачи по HTTP, которое он использует от Linux до iOS. Он здесь пользователь, и его сайт Ионная пушка .

См. вопрос для более подробной информации.

1 голос
/ 15 июня 2011

Вместо того, чтобы отправлять поток в виде UDP, попробуйте отправить поток с помощью RTSP. MPMoviePlayerController будет воспроизводить его.

1 голос
/ 10 июня 2011

MPMoviePlayerController может обрабатывать потоковое видео, попробуйте просто передать ему URL-адрес напрямую.

Что касается видео, которое не воспроизводится даже после сохранения, вы уверены, что видео находится в поддерживаемом формате?Quoth документация :

Этот класс воспроизводит любой фильм или аудиофайл, поддерживаемый в iOS.Это включает в себя как потоковый контент, так и файлы фиксированной длины.Для файлов фильмов это обычно означает файлы с расширениями .mov, .mp4, .mpv и .3gp и с использованием одного из следующих стандартов сжатия:

  • H.264 Baseline Profile Level 3.0 video,до 640 x 480 при 30 кадрах в секунду.(Базовый профиль не поддерживает B-кадры.)
  • MPEG-4, часть 2 видео (простой профиль)

Попробуйте использовать -vcodec libx264 -vpre baseline в командной строке ffmpeg, чтобыиспользуйте базовый профиль.

0 голосов
/ 11 июня 2011
...