Я пытаюсь отправить и показать поток веб-камеры с сервера 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?
ОБНОВЛЕНИЕ: я отредактировал свой вопрос, добавив больше информации о том, что я сделал с тех пор, и в чем мои сомнения.