1 . AAC Метод генерации аудиообразцов данных : FAAC Вызов кодировщика faacEncEncode метод , генерировать AAC Образцы аудиоданных ;
2 . faacEncEncode методпрототип :
#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. Пример кода:
int encodeAacDataByteCount = faacEncEncode(
mFaacEncHandle, // FAAC кодер
reinterpret_cast<int32_t *>(data), // Нужно закодировать PCM Входные аудиоданные
mInputSamples, // входящий PCM Количество образцов
mFaacEncodeOutputBuffer, // закодированный AAC Форматировать выходной аудиобуфер
mMaxOutputBytes); // Максимальный размер выходного буфера в байтах
1. Номер пакета.
Байты данных : Инкапсулировано в первом байте
частичные данные , аудиоформат , Частота выборки , Количество бит выборки , аудиоканал ; Обычно это AE , или AF ;
① AF значение : AAC Формат , 44100 Hz выборка ,16 Кусочек Количество бит выборки, стерео ;
② AE значение : AAC Формат , 44100 Hz выборка ,16 Кусочек Количество бит выборки, мононуклеоз ;
Справочный блог 【Android RTMP】Кодирование сбора аудиоданных ( AAC аудиоформат анализировать | FLV Анализ тегов аудиоданных | AAC заголовок тега аудиоданных | Информация о конфигурации декодирования звука ) ,Четыре, Информация о конфигурации декодирования звука、 2. Нет. 11 байт AF Анализ данных глава , Там есть подробное введение
Значение каждого представителя;
2. Пример кода:
/*
По количеству каналов средняя стоимость соответствует из Заголовок файла логотип
AF / AE Последняя цифра из в голове 1 выражатьстерео, для 0 мононуклеоз
AF дастерео AE дамононуклеоз */
rtmpPacket->m_body[0] = 0xAF; //по умолчаниюстерео if (mChannelConfig == 1) {
// в случаемононуклеоз, Измените это значение на AE
rtmpPacket->m_body[0] = 0xAE;
}
AAC тип аудиоданных : в случаекодированиеиз Образцы аудиоданных , Тип 01 , в случае AAC Декодировать информацию , Тип 00 ; вот 01 тип , AAC Образцы аудиоданных ;
// кодированиевнеиззвук Все 0x01,книгаметодда对аудиоданныеруководитькодированиеизметод, Информация заголовка должна быть AF 01 данные
// данные определенно AAC Форматизвыборкаданные
rtmpPacket->m_body[1] = 0x01;
Звонил раньше faacEncEncodeметод ,генерировать Понятно AAC Формат Образцы аудиоданных, 将генерировать инкапсуляцию информации для RTMPPacket в пакете данных ,RTMP данные Сумкаизразмердагенерировать AAC Размер аудиоданных + 2 ; дополнительный 2 Байты данныхда AF 01 ;
// копировать AAC аудиоданные для RTMPPacket в пакете данных
memcpy(&rtmpPacket->m_body[2], mFaacEncodeOutputBuffer, encodeAacDataByteCount);
Размер пакета 2 байт , плюс faacEncEncodeметодгенерировать из AAC Формат Образцы размер аудиоданных ;
2 Байт AF 01 , означает, что данные AAC аудиоданные ;
/*
данныеизразмер :
Есть впереди 2 байтовая информация заголовка
Информация о конфигурации декодирования звука : Первые два AF 00 , гид AAC Как расшифровать данные
Информация об аудиовыборке : Первые два AF 01 , Действительный AAC Образцы аудиоданных
*/
int rtmpPackagesize = 2 + 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;
/**
* аудиоданныекодирование
* перенимать 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);
}
}