当前位置: 首页 > news >正文

iOS音频AAC视频H264编码 推流最佳方案

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

项目都是个人的调研与实验,可能很多不好或者不对的地方请多包涵。

1    功能概况

*  实现音视频的数据的采集

*  实现音视频数据的编码,视频编码成h264,音频编码成aac

*  实现音视频数据的发布,将编码好的音视频数据传输到服务器


2 视频和音频编码方案

视频硬编码需要使用AVAssetWriter,但是他只支持直接将数据编码成h264并写入文件,不提供接口中途获取视频数据处理,我们需要在保存的文件中读出数据

据顶采用软编码,主流开源编解码器Xvid,x264,ffmpeg,Xvid是基于MPEG4协议的编解码器,x264是基于H.264协议的编码器,ffmpeg集合了各种音频,视频编解码协议,通过设置参数可以完成基于MPEG4,H.264等协议的编解码,基于效率,决定使用x264进行软编

Ios支持aac音频软编码和硬编码,硬编无需消耗cpu,效率高,决定使用硬编。使用Audio Queue


3. 技术流程图



4  相关技术

(1)x264编码器

x264是一个采用GPL授权的视频编码自由软件[1]。x264的主要功能在于进行H.264/MPEG-4 AVC的视频编码,而不是作为解码器(decoder)之用。

(2) 在xcode下编译x264库

*  下载x264的库

*  打开shell,执行编译,由于我们的饮食频道额采集在模拟器上不能进行,所以不编译i386的库,直接编译armv7的库

*  执行make,编译成功得到libx264.a


(3) Audioqueue简介

要在iOS设备上播放和录制音频,苹果推荐我们使用AVFoundation框架中的AVAudioPlayer和AVAudioRecorder类。虽然用法比较简单,但是不支持流式;这就意味着:在播放音频前,必须等到整个音频加载完成后,才能开始播放音频;录音时,也必须等到录音结束后,才能获取到录音数据。这给应用造成了很大的局限性。为了解决这个问题,我们就需要使用Audio Queue Services来播放和录制音频.

Audio Queue Services提供了在iOS 和 Mac OS X上直接录制和播放各种格式的音频,他能让你的应用程序在没有硬件接口知识的情况下使用硬件录音和播放设备,如microphones 和loudspeakers。


(4)  Audioqueue录制音频过程

一个Recording Audio Queue,包括Buffer(缓冲器)组成的Buffer Queue(缓冲队列),以及一个Callback(回调)

录音流程如下:

l 将音频填入第一个缓冲器中

l 当队列中的第一个缓冲器填满时,会自动填充下一个缓冲器。此时,会触发回调。

l 在回调函数中需要将音频数据流写入磁盘

l 然后,需要在回调函数中将该缓冲器重新放入缓冲队列,以便重复使用该缓冲器。重复步骤2。

Audio Queue录制aac音频数据如下流程:



5 rtmp发送音视频

  xcode中编译librtmp库

在xcode中使用librtmp库可将音视频数据打成包,遵循rtmp协议,将数据发送到指定服务器,前提需要编译librtmp库并在xcode中使用此库

*  下载rtmpdump源码

*  shell下编译librtmp成librtmp.a并加入到xcode工程

*  拷贝rtmpdump的include文件夹到xcode下的相应工程,并将路径添加到User Header SearchPaths

*  在工程中引入使用librtmp


6. 音视频同步

采用时间戳技术,时间戳即为一帧的采集时间,音视频采取同一个参考时间,给每个帧打上时间戳


待续。。。


转载于:https://my.oschina.net/u/2286256/blog/538190

相关文章:

  • 【十大经典数据挖掘算法】C4.5
  • logstash推送mysql慢查询日志
  • 51cto博客第一篇
  • c语言:将三个数按从大到小输出。
  • 正则与JS中的正则
  • JAVA实现发送电子邮件
  • JS组件系列——表格组件神器:bootstrap table
  • JavaScript数组使用sort排序
  • junit测试时,出现java.lang.IllegalStateException: Failed to load ApplicationContext
  • 我的Android进阶之旅------Android【设置】-【语言和输入法】-【语言】列表中找到相应语言所对应的列表项...
  • BZOJ1075 : [SCOI2007]最优驾车drive
  • SharePoint自动化系列——Create a local user and add to SharePoint
  • iOS 轻量级的数据库leveldb
  • 混合的方式开启服务
  • JSDOM对象控制HTML元素
  • [译]如何构建服务器端web组件,为何要构建?
  • 【Linux系统编程】快速查找errno错误码信息
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Git 使用集
  • gitlab-ci配置详解(一)
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • k8s如何管理Pod
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • vue-cli在webpack的配置文件探究
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 将 Measurements 和 Units 应用到物理学
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 跨域
  • 深入浅出webpack学习(1)--核心概念
  • 原生Ajax
  • 正则表达式小结
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​卜东波研究员:高观点下的少儿计算思维
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • (003)SlickEdit Unity的补全
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十一)手动添加用户和文件的特殊权限
  • (转)Scala的“=”符号简介
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .NET Core 2.1路线图
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .Net MVC4 上传大文件,并保存表单
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • @AutoConfigurationPackage的使用
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution