AIRPLAY镜像音频数据的处理
来源:互联网 发布:js导出excel兼容ie 编辑:程序博客网 时间:2024/05/18 00:55
AIRPLAY镜像投屏过程中,音视频数据都是加密过的,对于接收端来说,需要正确解密后才能对音视频数据进行处理,音频和视频的解密过程还不一样。音频相对简单一点,视频会复杂一些。这一块的解密过程是没有公开的,是苹果自身的Fairplay DRM协议部分。现在市面上的第三方Airplay接收端无非都是通过逆向过程破解了相关部分。
本文针对音频的处理做一个介绍,音频部分的处理相对简单一点。
解密过程:
1 音频采用AES CBC128进行加密,这一部分可以使用开源的openssl库进行处理
2 该算法需要解密的输入参数包括aeskey,aeskiv,通过
ANNOUNCE请求中携带,ANNOUNCE请求同时还会携带音频的编码信息。
解码过程:
通过解密过程后,我们会得到AAC编码的音频数据,播放器播放AAC数据还需要对其进行解码。
在我们实现的接收端程序,协商出来的是AAC-ELD编码。对于AAC的解码,可以使用一些开源的库,如fdk,ffmpeg等,也可以使用android提供的MediaCodec进行解码。
但笔者曾经在某些Android手机上发现,解码AAC-ELD有问题。推荐大家用fdk进行解码。
使用fdk对aac进行解码,其实在网上也能找到很多例子,但笔者发现很多例子有一处错误,在低版本的fdk上不会出现错误,但是在高版本的fdk会出现crash这样的问题。话不多说,直接通过部分代码来说明过程。
初始化解码器:
UCHAR eld_conf[] = { 0xF8, 0xE8, 0x50, 0x00 }; //44100,2channels,s16UCHAR *aac_eld_conf[] = { eld_conf }; //TODO just for aac eld configstatic UINT aac_eld_conf_len = sizeof(eld_conf);decoder = aacDecoder_Open(TT_MP4_RAW, 1);AAC_DECODER_ERROR ret = aacDecoder_ConfigRaw(decoder, aac_eld_conf, &aac_eld_conf_len);buffer = new INT_PCM[960];buffer_size = 1920;pcm_size = 960;
上述代码中eld_conf这一块的值对应android MediaCodec aac,CSD buffer #0具体什么含义看规范吧。
每次编码和发送的采用数为480,故下面申请对应长度的Buffer
解码:
bytesValid = dataLen; while(bytesValid){ret = aacDecoder_Fill(decoder, reinterpret_cast<UCHAR **>(&p_frame), (UINT*)&size, &bytesValid); if (ret != AAC_DEC_OK) { printf("aacDecoder_Fill return %x.\r\n", ret); return; } for (;;) { ret = aacDecoder_DecodeFrame(decoder, buffer, pcm_size, 0); if (ret == AAC_DEC_OK) { dump_audio_data((unsigned char *)buffer,buffer_size); } else if (ret == AAC_DEC_NOT_ENOUGH_BITS) break; else { printf("aacDecoder_DecodeFrame return %x.\r\n", ret); return; } } }
aacDecoder_DecodeFrame填入的参数为pcm_size,其单位为short,而不是byte。网上的例子很多都是在这里错误。请各位务必注意。
技术交流有兴趣请加:
音视频技术交流群:308601278
无线投屏技术交流群:582349005
无线投屏官网: http://www.wirelessdisplay.cn/
无线投屏DEMO下载: https://github.com/wirelessdisplay
公司官网
www.bijienetworks.com
我司有成熟的视频会议/视频监控/视频调度/无线投屏盒子销售,也可做音视频相关产品和技术的定制化开发
商务合作请至邮件marketing@bijienetworks.com
- AIRPLAY镜像音频数据的处理
- 支持视音频和图片无线传屏以及屏幕镜像的Airplay的前世今生
- ios airplay mirroring镜像
- 音频数据的处理
- 关于airplay协议实现镜像功能研究
- 简单处理音频输入数据的类
- ffmpeg笔记:音频数据和视频数据的处理
- 琢磨AirPlay的经历 Airplay简析
- iOS 开发 高级:通过AirServer使用AirPlay镜像并实现多屏幕显示控制
- iOS 开发 高级:通过AirServer使用AirPlay镜像并实现多屏幕显示控制
- iOS学习笔记20-通过AirServer使用AirPlay镜像并实现多屏幕显示控制
- 禁掉MPMoviePlayerController的Airplay
- AirPlay
- airplay
- AirPlay
- airplay
- 音频处理的基本概念
- 如何处理恶意的镜像网站?
- Jdk8源码阅读之InputStream
- 一、Maven安装
- Linux文件及目录的管理
- 多线程安全问题以及解决安全问题的原理
- mysql 编程 变量的声明赋值定义
- AIRPLAY镜像音频数据的处理
- SCAPE: shape completion and animation of people
- Oracle分组统计查询-统计函数
- webpack
- 异常解决 java.io.FileNotFoundException: class path resource [spring/applicationContext_*.xml]
- FastCGI加载PHP伪静态设置的注意事项
- .gen格式文件读取,完成兰伯特和墨卡托投影转换
- git学习
- 如何实现图片懒加载