Muxing сжатые кадры из VTCompressionSession с аудиоданными в контейнер MPEG2-TS для потоковой передачи сети

Я работаю над проектом, который включает в себя захват кадров с кодировкой H.264 с VTCompressionSession в iOS8, мультиплексирование их с помощью звука AAC или PCM с микрофона в воспроизводимый MPEG2-TS и потоковой передачи по сокету в реальном времени с минимальной задержкой ( т.е.: (почти) отсутствие буферизации).

После просмотра презентации для нового VideoToolbox в iOS8 и проведения некоторых исследований, я думаю, можно с уверенностью предположить, что:

  • Закодированные кадры, которые вы получаете из VTCompressionSession, не входят в формат приложения B, поэтому мне нужно каким-то образом их преобразовать (все объяснения, которые я видел до сих пор, слишком расплывчаты, поэтому я не уверен в том, как вы это делаете (т.е. : Замените заголовок «3 или 4 байта заголовком длины»)).

  • Закодированные кадры, которые вы получаете из VTCompressionSession, на самом деле являются элементарным потоком. Поэтому сначала мне нужно будет превратить их в пакетный элементарный поток, прежде чем его можно будет мультиплексировать.

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

  • Для мультиплексирования пакетных элементарных потоков мне также понадобится библиотека, подобная libmpegts. Или, возможно, ffmpeg (используя библиотеки libavcodec и libavformat).

Я довольно новичок в этом. Могу ли я получить некоторые советы о том, какой был бы правильный подход для достижения этого ?.

Есть ли более простой способ реализовать это с помощью API Apple (например, AVFoundation)?

Есть ли какой-либо аналогичный проект, который я могу взять в качестве ссылки?

Заранее спасибо!

  • Почему AVSampleBufferDisplayLayer не работает с прерыванием работы (-11847)?
  • Может ли CMSampleBuffer декодировать кадры H264?
  • Декодирование видео с помощью CoreMedia.framework на iOS
  • Как отображает AVSampleBufferDisplayLayer H.264
  • Аппаратное ускорение декодирования h.264 на текстуру, наложение или подобное в iOS
  • Публикация RTMP-потока в Red5 Server формы iOS-камеры
  • Разбор h.264 единиц NAL из файла MOV QuickTime
  • Извлечение h264 из CMBlockBuffer
  • One Solution collect form web for “Muxing сжатые кадры из VTCompressionSession с аудиоданными в контейнер MPEG2-TS для потоковой передачи сети”

    Для мультиплексирования пакетных элементарных потоков мне также понадобится библиотека, подобная libmpegts. Или, возможно, ffmpeg (используя библиотеки libavcodec и libavformat).

    Из того, что я могу собрать, нет никакого способа для мультиплексирования TS с AVFoundation или связанных с ним фреймворков. Хотя кажется, что что-то можно сделать вручную, я пытаюсь использовать библиотеку Bento4 для выполнения той же задачи, что и вы. Я предполагаю, что libmpegts, ffmpeg, GPAC, libav или любая другая библиотека тоже будет работать, но мне не нравятся их API.

    В основном, я следую Mp42Ts.cpp , игнорируя части Mp4 и просто смотрю на части, пишущие Ts.

    В этом вопросе StackOverflow есть все сведения о том, как его подавать, и о том, как его подавать. Если у вас есть какие-либо вопросы, напишите мне более конкретный вопрос.

    Надеюсь, это послужит хорошей отправной точкой для вас.

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

    Получение данных микрофона как AAC очень просто. Что-то вроде этого:

    AVCaptureDevice *microphone = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; _audioInput = [AVCaptureDeviceInput deviceInputWithDevice:microphone error:&error]; if (_audioInput == nil) { NSLog(@"Couldn't open microphone %@: %@", microphone, error); return NO; } _audioProcessingQueue = dispatch_queue_create("audio processing queue", DISPATCH_QUEUE_SERIAL); _audioOutput = [[AVCaptureAudioDataOutput alloc] init]; [_audioOutput setSampleBufferDelegate:self queue:_audioProcessingQueue]; NSDictionary *audioOutputSettings = @{ AVFormatIDKey: @(kAudioFormatMPEG4AAC), AVNumberOfChannelsKey: @(1), AVSampleRateKey: @(44100.), AVEncoderBitRateKey: @(64000), }; _audioWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:audioOutputSettings]; _audioWriterInput.expectsMediaDataInRealTime = YES; if(![_writer canAddInput:_audioWriterInput]) { NSLog(@"Couldn't add audio input to writer"); return NO; } [_writer addInput:_audioWriterInput]; [_captureSession addInput:_audioInput]; [_captureSession addOutput:_audioOutput]; - (void)audioCapture:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { /// sampleBuffer contains encoded aac samples. } 

    Я предполагаю, что вы уже используете AVCaptureSession для своей камеры; вы можете использовать один и тот же сеанс захвата для микрофона.

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.