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

  • Кодировать аудиопоток h264, совместимый с iOS, с FFMPEG
  • Декодирование H264 VideoToolkit API завершается с ошибкой -8971 в VTDecompressionSessionCreate
  • Как перенести файл h.264 в mp4 на iOS
  • Создание потокового видеопроигрывателя для iOS без AVPlayer
  • Использование AVAssetWriter с необработанными модулями NAL
  • Raw H264 NALU аппаратное декодирование на iOS
  • кодирование видео для циклирования?
  • Публикация RTMP-потока в Red5 Server формы iOS-камеры
  • как потоковое видео h.264 отправляет WOWZA с помощью rtsp с live555
  • Может ли CMSampleBuffer декодировать кадры H264?
  • h.264 видео не будет воспроизводиться на iOS
  • Interesting Posts

    Интеграция Dropbox в iPhone приложение ошибка 400

    Почему я не могу дублировать сеансы AVCapture?

    Сохраняется ли хранилище keychain iOS при восстановлении приложения на новом устройстве?

    Xcode 4.5.1 iOS5 / 5.1 IBAction не работает. Прекрасно в iOS6

    Разрешить перезаписывать файл с помощью alamofire

    API REST API в Swift Использование запроса на анализ

    iOS Simulator / Interface Builder вне центра

    Заголовок кнопки UINavigationBar скрыт, когда заголовок заголовка слишком длинный в iOS7

    Обрабатывать удаленное уведомление для приложения чата в iOS

    Xcode неподдерживаемая архитектура armv7k

    Простое понимание кода #define и enum

    Swift: UIButton против UIView

    Как перенести базовую модель данных данных при добавлении абстрактного родительского объекта?

    Предотвратить событие click после обработки события jQuery Mobile на iOS

    Создать приложение для родительского контроля iOS

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