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)?

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

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

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 для своей камеры; вы можете использовать один и тот же сеанс захвата для микрофона.

  • H.264 кодированный MP4, представленный в играх HTML5 на Safari, но не на устройствах iOS
  • Публикация RTMP-потока в Red5 Server формы iOS-камеры
  • Разбор h.264 единиц NAL из файла MOV QuickTime
  • Кодировать аудиопоток h264, совместимый с iOS, с FFMPEG
  • Raw H264 NALU аппаратное декодирование на iOS
  • Декодирование видео с помощью CoreMedia.framework на iOS
  • mux raw h 264 в файл mp4, некоторые нечетные ошибки
  • Создание потокового видеопроигрывателя для iOS без AVPlayer
  • Как я могу выполнить аппаратное ускорение кодирования и декодирования H.264 для потоковой передачи?
  • Как перенести файл h.264 в mp4 на iOS
  • Использование AVAssetWriter с необработанными модулями NAL
  • Interesting Posts

    Автомаркет: Xcode 6: Центрирование элементов пользовательского интерфейса

    Bluetooth LE и ANCS в iOS

    Правильно отпустите ViewController при добавлении subview без navigationController

    Автоматическое добавление UINavigationBar в UIView?

    Watchkit: таблица с двумя шаблонами в динамических рядах

    Можно ли объявить тип переменной из строки?

    Objective-C Блоки и переменная область

    Обнаружение Jailbroken iOS Device, выполнив незаписанный исполняемый файл

    IB Designables: не удалось обновить статус автоматического макета: агент поднял исключение «NSInternalInconsistencyException»: не удалось загрузить NIB в комплекте

    Запись звука во время воспроизведения звука

    Программно проверить поддержку контакта iMessage

    ARC запрещает автореферат?

    Обнаружение телефонных звонков в iOS с помощью CTCallCenter (Swift)

    Усилить UIFont для рендеринга как моноширинный

    Использовать API поиска Apple для поиска по жанру?

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