本文共 1963 字,大约阅读时间需要 6 分钟。
基于librtmp开发RTMP客户端的demo,主要是按照雷神的demo(见5.1)来修改,修改后的demo能将获取到的音视频数据写成h264文件及aac文件。
FLV(Flash Video)是一种常见的视频格式,广泛应用于网络流媒体播放。关于FLV格式的技术细节,以下是几点重要说明:
FLV tag类型:FLV文件中定义的tag类型主要有三种:
tag组成:
tagSize决定,tagSize可以是1、2、3或4字节。h264视频格式的特殊说明:
VideoTagHeader会额外包含4个字节的信息: AVCPacketType,用于标识包的类型。CompositionTime,表示视频帧的时间戳。在实现h264视频和aac音频的编码过程中,需要注意以下几点:
sps及pps数据的处理:
aac音频处理:
sample_rate字段由2位采样率信息位表示,值总是3(表示48kHz)。以下是用于向aac音频包中添加adts头部的代码示例:
static void addADTStoPacket(char* packet, int packetLen, int frequence) { int profile = 2; // AAC LC int freqIdx = -1; int chanCfg = 2; // Stereo双声道 static int avpriv_mpeg4audio_sample_rates[] = { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350 }; for (int i = 0; i < 13; ++i) { if (frequence == avpriv_mpeg4audio_sample_rates[i]) { freqIdx = i; break; } } if (freqIdx == -1) { printf("Invaild frequence [%d] \n", frequence); return; } // 填充adts数据 packet[0] = 0xFF; packet[1] = 0xF1; packet[2] = (char)(((profile - 1) << 6) + (freqIdx << 2) + (chanCfg >> 2)); packet[3] = (char)(((chanCfg & 3) << 6) + (packetLen >> 11)); packet[4] = (char)((packetLen & 0x7FF) >> 3); packet[5] = (char)((packetLen & 0x7F) >> 0); packet[6] = 0xFC;} 在centos6.9系统上,修改后的demo可以同时生成flv、h264和aac文件(仅限48kHz、aac-lc、16bit采样)。以下是实现的主要特点:
以上内容经过优化后,结构清晰,内容详实,适合技术文档或开发者博客使用。
转载地址:http://htoe.baihongyu.com/