[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
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose