[Android RTMP] Сбор и кодирование аудиоданных (кодер FAAC кодирует образцы аудиоданных AAC | инкапсулирует заголовок аудиоданных RTMP | устанавливает тип аудиоданных AAC | инкапсулирует пакеты данных RTMP)
[Android RTMP] Сбор и кодирование аудиоданных (кодер FAAC кодирует образцы аудиоданных AAC | инкапсулирует заголовок аудиоданных RTMP | устанавливает тип аудиоданных AAC | инкапсулирует пакеты данных RTMP)

Каталог статей

1. Кодер FAAC кодирует данные аудиообразцов AAC.


1 . AAC Метод генерации аудиообразцов данных : FAAC Вызов кодировщика faacEncEncode метод , генерировать AAC Образцы аудиоданных ;

2 . faacEncEncode методпрототип :

Язык кода:javascript
копировать
#include <faac.h>

int FAACAPI faacEncEncode(faacEncHandle hEncoder, int32_t * inputBuffer, unsigned int samplesInput,
			 unsigned char *outputBuffer,
			 unsigned int bufferSize);

① возвращаемое значение : Длина байта закодированных данных

② faacEncHandle hEncoder параметр : FAAC кодер

③ int32_t * inputBuffer параметр : Нужно закодировать PCM Входные аудиоданные

④ unsigned int samplesInput : входящий PCM Количество образцов

⑤ unsigned char *outputBuffer : закодированный AAC Форматировать выходной аудиобуфер

⑥ unsigned int bufferSize : Максимальный размер выходного буфера в байтах

Последние два параметра определяют разные уровни изоуказательтипа. , Используйте метод по-другому , Но форма похожа , Все используют переменные указателя , Передайте адрес в качестве параметра ,входящийуказателькаквозвращаемое значение使用 ;

3. Пример кода:

Язык кода:javascript
копировать
    int encodeAacDataByteCount = faacEncEncode(
            mFaacEncHandle, // FAAC кодер
            reinterpret_cast<int32_t *>(data), // Нужно закодировать PCM Входные аудиоданные
            mInputSamples, // входящий PCM Количество образцов
            mFaacEncodeOutputBuffer, // закодированный AAC Форматировать выходной аудиобуфер
            mMaxOutputBytes); // Максимальный размер выходного буфера в байтах

2. Инкапсуляция заголовка аудиоданных RTMP.


1. Номер пакета.

1

Байты данных : Инкапсулировано в первом байте

4

частичные данные , аудиоформат , Частота выборки , Количество бит выборки , аудиоканал ; Обычно это AE , или AF ;

① AF значение : AAC Формат , 44100 Hz выборка ,16 Кусочек Количество бит выборки, стерео ;

② AE значение : AAC Формат , 44100 Hz выборка ,16 Кусочек Количество бит выборки, мононуклеоз ;

Справочный блог 【Android RTMP】Кодирование сбора аудиоданных ( AAC аудиоформат анализировать | FLV Анализ тегов аудиоданных | AAC заголовок тега аудиоданных | Информация о конфигурации декодирования звука ) ,Четыре, Информация о конфигурации декодирования звука、 2. Нет. 11 байт AF Анализ данных глава , Там есть подробное введение

8

Значение каждого представителя;

2. Пример кода:

Язык кода:javascript
копировать
    /*
        По количеству каналов средняя стоимость соответствует из Заголовок файла логотип
        AF / AE Последняя цифра из в голове 1 выражатьстерео, для 0 мононуклеоз
        AF дастерео        AE дамононуклеоз     */
    rtmpPacket->m_body[0] = 0xAF;   //по умолчаниюстерео    if (mChannelConfig == 1) {
        // в случаемононуклеоз, Измените это значение на AE
        rtmpPacket->m_body[0] = 0xAE;
    }

3. Инкапсуляция типа аудиоданных RTMP.


AAC тип аудиоданных : в случаекодированиеиз Образцы аудиоданных , Тип 01 , в случае AAC Декодировать информацию , Тип 00 ; вот 01 тип , AAC Образцы аудиоданных ;

Язык кода:javascript
копировать
// кодированиевнеиззвук Все 0x01,книгаметодда对аудиоданныеруководитькодированиеизметод, Информация заголовка должна быть AF 01 данные
// данные определенно AAC Форматизвыборкаданные
rtmpPacket->m_body[1] = 0x01;

4. Скопируйте аудиоданные AAC в пакет RTMPPacket.


Звонил раньше faacEncEncodeметод ,генерировать Понятно AAC Формат Образцы аудиоданных, 将генерировать инкапсуляцию информации для RTMPPacket в пакете данных ,RTMP данные Сумкаизразмердагенерировать AAC Размер аудиоданных + 2 ; дополнительный 2 Байты данныхда AF 01 ;

Язык кода:javascript
копировать
        // копировать AAC аудиоданные для RTMPPacket в пакете данных
        memcpy(&rtmpPacket->m_body[2], mFaacEncodeOutputBuffer, encodeAacDataByteCount);

5. Установите размер пакета данных.


Размер пакета 2 байт , плюс faacEncEncodeметодгенерировать из AAC Формат Образцы размер аудиоданных ;

2 Байт AF 01 , означает, что данные AAC аудиоданные ;

Язык кода:javascript
копировать
        /*
            данныеизразмер :
            Есть впереди 2 байтовая информация заголовка
            Информация о конфигурации декодирования звука : Первые два AF 00 , гид AAC Как расшифровать данные
            Информация об аудиовыборке : Первые два AF 01 , Действительный AAC Образцы аудиоданных
         */
        int rtmpPackagesize = 2 + encodeAacDataByteCount;

6. Установите абсолютное время, тип данных, канал RTMP, тип заголовка.


Этиданныенастраивать基книга Все Форматизменятьиз , Просто следуйте настройкам ниже ;

Язык кода:javascript
копировать
    // настройка абсолютного времени, в целомнастраивать 0 Вот и все
    rtmpPacket->m_hasAbsTimestamp = 0;
    // настраивать RTMP данные Сумкаразмер    rtmpPacket->m_nBodySize = rtmpPackagesize;
    // настраивать RTMP Сумкатип, Видео типданные
    rtmpPacket->m_packetType = RTMP_PACKET_TYPE_AUDIO;
    // распространять RTMP ряд, Значение произвольное Предложения в видео H.264 В верхней части канала 1
    rtmpPacket->m_nChannel = 0x11;
    // // настраиватьголоватип, Не стесняйтесь настраивать один
    rtmpPacket->m_headerType = RTMP_PACKET_SIZE_LARGE;

7. Пример кода кодирования кодера FAAC


Язык кода:javascript
копировать
/**
 * аудиоданныекодирование
 * перенимать int8_t типиз Причина в том, Обработка здесь такая jbyte* типпараметр
 * jbyte тип int8_t тип
 * @param data
 */
void AudioChannel::encodeAudioData(int8_t *data) {

    /*
        прототип функции :
        int FAACAPI faacEncEncode(
            faacEncHandle hEncoder,
            int32_t * inputBuffer,
            unsigned int samplesInput,
            unsigned char *outputBuffer,
            unsigned int bufferSize);

        faacEncHandle hEncoder параметр : FAAC кодер
        int32_t * inputBuffer параметр : Нужно закодировать PCM Входные аудиоданные
        unsigned int samplesInput : входящий PCM Количество образцов
        unsigned char *outputBuffer : закодированный AAC Форматировать выходной аудиобуфер
        unsigned int bufferSize : Максимальный размер выходного буфера в байтах

        возвращаемое значение : Длина байта закодированных данных
     */
    int encodeAacDataByteCount = faacEncEncode(
            mFaacEncHandle, // FAAC кодер
            reinterpret_cast<int32_t *>(data), // Нужно закодировать PCM Входные аудиоданные
            mInputSamples, // входящий PCM Количество образцов
            mFaacEncodeOutputBuffer, // закодированный AAC Форматировать выходной аудиобуфер
            mMaxOutputBytes); // Максимальный размер выходного буфера в байтах


    // Собрать RTMP данные Сумка    if (encodeAacDataByteCount > 0) {
        /*
            данныеизразмер :
            Есть впереди 2 байтовая информация заголовка
            Информация о конфигурации декодирования звука : Первые два AF 00 , гид AAC Как расшифровать данные
            Информация об аудиовыборке : Первые два AF 01 , Действительный AAC Образцы аудиоданных
         */
        int rtmpPackagesize = 2 + encodeAacDataByteCount;

        // создавать RTMP объект пакета данных
        RTMPPacket *rtmpPacket = new RTMPPacket;

        // для RTMP данные Сумкараспространять内存
        RTMPPacket_Alloc(rtmpPacket, rtmpPackagesize);

        /*
            По количеству каналов средняя стоимость соответствует из Заголовок файла логотип
            AF / AE Последняя цифра из в голове 1 выражатьстерео, для 0 мононуклеоз
            AF дастерео            AE дамононуклеоз         */
        rtmpPacket->m_body[0] = 0xAF;   //по умолчаниюстерео        if (mChannelConfig == 1) {
            // в случаемононуклеоз, Измените это значение на AE
            rtmpPacket->m_body[0] = 0xAE;
        }

        // кодированиевнеиззвук Все 0x01,книгаметодда对аудиоданныеруководитькодированиеизметод, Информация заголовка должна быть AF 01 данные
        // данные определенно AAC Форматизвыборкаданные
        rtmpPacket->m_body[1] = 0x01;

        // копировать AAC аудиоданные для RTMPPacket в пакете данных
        memcpy(&rtmpPacket->m_body[2], mFaacEncodeOutputBuffer, encodeAacDataByteCount);

        // настройка абсолютного времени, в целомнастраивать 0 Вот и все
        rtmpPacket->m_hasAbsTimestamp = 0;
        // настраивать RTMP данные Сумкаразмер        rtmpPacket->m_nBodySize = rtmpPackagesize;
        // настраивать RTMP Сумкатип, Видео типданные
        rtmpPacket->m_packetType = RTMP_PACKET_TYPE_AUDIO;
        // распространять RTMP ряд, Значение произвольное Предложения в видео H.264 В верхней части канала 1
        rtmpPacket->m_nChannel = 0x11;
        // // настраиватьголоватип, Не стесняйтесь настраивать один
        rtmpPacket->m_headerType = RTMP_PACKET_SIZE_LARGE;

        // Вызовите интерфейс обратного вызова, Будет ли инкапсуляция хороша? RTMPPacket пакет данных вставлен native-lib Класс из Потокобезопасная очередь
        // Это RTMPPacketPackUpCallBack типизфункцияуказатель        mRtmpPacketPackUpCallBack(rtmpPacket);
    }

}
boy illustration
Spring Boot(06): Spring Boot в сочетании с MySQL создает минималистскую и эффективную систему управления данными.
boy illustration
Как использовать ArrayPool
boy illustration
Интегрируйте iText в Spring Boot для реализации замены контента на основе шаблонов PDF.
boy illustration
Redis реализует очередь задержки на основе zset
boy illustration
Получить текущий пакет jar. path_java получает файл jar.
boy illustration
Краткое обсуждение высокопроизводительного шлюза Apache ShenYu
boy illustration
Если вы этого не понимаете, то на собеседовании даже не осмелитесь сказать, что знакомы с Redis.
boy illustration
elasticsearch медленный запрос, устранение неполадок записи, запрос с подстановочными знаками
boy illustration
По какому стандарту взимается плата за обслуживание программного обеспечения?
boy illustration
IP-адрес Получить
boy illustration
【Java】Решено: org.springframework.web.HttpRequestMethodNotSupportedException
boy illustration
Native js отправляет запрос на публикацию_javascript отправляет запрос на публикацию
boy illustration
.net PDF в Word_pdf в Word
boy illustration
[Пул потоков] Как Springboot использует пул потоков
boy illustration
Подробное объяснение в одной статье: Как работают пулы потоков
boy illustration
Серия SpringCloud (6) | Поговорим о балансировке нагрузки
boy illustration
IDEA Maven может упаковать все импортное полностью красное решение — универсальное решение.
boy illustration
Последний выпуск 2023 года, самое полное руководство по обучению Spring Boot во всей сети (с интеллект-картой).
boy illustration
[Решено — Практическая работа] SaTokenException: запрос не может быть получен в контексте, отличном от Интернета. Решение проблем — Практическая работа.
boy illustration
HikariPool-1 - Connection is not available, request timed out after 30000ms
boy illustration
Power Query: автоматическое суммирование ежемесячных данных с обновлением одним щелчком мыши.
boy illustration
установка Ubuntu в среде npm
boy illustration
3 Бесплатные системы управления складом (WMS) .NET с открытым исходным кодом
boy illustration
Глубокое погружение в библиотеку Python Lassie: мощный инструмент для автоматизации извлечения метаданных
boy illustration
Объяснение прослушивателя серии Activiti7 последней версии 2023 года
boy illustration
API-интерфейс Jitu Express для электронных счетов-Express Bird [просто для понимания]
boy illustration
Каковы архитектуры микросервисов Java. Серверная часть плавающей области обслуживания
boy illustration
Описание трех режимов жизненного цикла службы внедрения зависимостей Asp.net Core.
boy illustration
Java реализует пользовательские аннотации для доступа к интерфейсу без проверки токена.
boy illustration
Серверная часть Unity добавляет поддержку .net 8. Я еще думал об этом два дня назад, и это сбылось.