-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAudioChannel.cpp
More file actions
99 lines (75 loc) · 2.71 KB
/
AudioChannel.cpp
File metadata and controls
99 lines (75 loc) · 2.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include "AudioChannel.h"
AudioChannel::AudioChannel()
: data_pack_up(nullptr)
, channelCfg(0)
, inputSamples(0)
, maxOutputBytes(0)
, faacEncHandle(nullptr)
, faacEncodeOutputBuffer(nullptr) {
}
AudioChannel::~AudioChannel() {
if(faacEncodeOutputBuffer) {
delete [] faacEncodeOutputBuffer;
faacEncodeOutputBuffer = nullptr;
}
if(faacEncHandle) {
delete faacEncHandle;
faacEncHandle = nullptr;
}
}
void AudioChannel::setAudioEncodeParams(int sampleRateInHz, int channelCfg) {
this->channelCfg = channelCfg;
faacEncHandle = faacEncOpen(sampleRateInHz, channelCfg, &inputSamples, &maxOutputBytes);
faacEncConfigurationPtr configurationPtr = faacEncGetCurrentConfiguration(faacEncHandle);
configurationPtr->mpegVersion = MPEG4;
configurationPtr->aacObjectType = LOW;
configurationPtr->inputFormat = FAAC_INPUT_16BIT;
configurationPtr->outputFormat = 0;
faacEncSetConfiguration(faacEncHandle, configurationPtr);
faacEncodeOutputBuffer = new uint8_t [maxOutputBytes];
}
void AudioChannel::setRTMPPacketCallBack(RTMPPacketCallBack callback) {
this->data_pack_up = callback;
}
int AudioChannel::getInputSamples() {
return inputSamples;
}
void AudioChannel::encodeAudioData(uint8_t* data) {
int len = faacEncEncode(
faacEncHandle,
reinterpret_cast<int32_t*>(data),
inputSamples,
faacEncodeOutputBuffer,
maxOutputBytes);
if(len > 0) {
int rtmpPacketSzie = 2 + len;
RTMPPacket* packet = new RTMPPacket;
RTMPPacket_Alloc(packet, rtmpPacketSzie);
packet->m_body[0] = (channelCfg == 1) ? 0xAE : 0xAF;
packet->m_body[1] = 0x01;
memcpy(packet->m_body + 2, faacEncodeOutputBuffer, len);
packet->m_hasAbsTimestamp = 0;
packet->m_nBodySize = rtmpPacketSzie;
packet->m_packetType = RTMP_PACKET_TYPE_AUDIO;
packet->m_nChannel = 0x11;
packet->m_headerType = RTMP_PACKET_SIZE_LARGE;
data_pack_up(packet);
}
}
RTMPPacket* AudioChannel::getAudioDecodeInfo() {
uint8_t* buf;
unsigned long len;
faacEncGetDecoderSpecificInfo(faacEncHandle, &buf, &len);
int rtmpPacketSzie = 2 + len;
RTMPPacket* packet = new RTMPPacket;
RTMPPacket_Alloc(packet, rtmpPacketSzie);
packet->m_body[0] = (channelCfg == 1) ? 0xAE : 0xAF;
packet->m_body[1] = 0x00;
memcpy(packet->m_body + 2, buf, len);
packet->m_hasAbsTimestamp = 0;
packet->m_nBodySize = rtmpPacketSzie;
packet->m_packetType = RTMP_PACKET_TYPE_AUDIO;
packet->m_nChannel = 0x11;
packet->m_headerType = RTMP_PACKET_SIZE_LARGE;
return packet;
}