第11月第3天 直播 rtmp yuv
1.
LiveVideoCoreSDK
AudioUnitRender ==> MicSource::inputCallback ==> GenericAudioMixer::pushBuffer
GenericAudioMixer::mixThread() ==> AACEncode::pushBuffer ==> Split::pushBuffer ==> AACPacketizer::pushBuffer ==> LibRtmpSessionMgr::pushBuffer
http://www.jianshu.com/p/5b1341e97757
服务器 http://www.cnblogs.com/damiao/p/5231221.html
brew install ffmpeg --with-ffplay
http://blog.csdn.net/charleslei/article/details/72462791
- (void)didProcessFrame:(CMSampleBufferRef)sampleBuffer
{
if(mVideoFilterView){
dispatch_async(dispatch_get_main_queue(), ^{
// if (self.cameraState == VCCameraStateFront) {
// mVideoFilterView.mirror = YES;
// } else {
// mVideoFilterView.mirror = NO;
// }
[mVideoFilterView renderFrame:sampleBuffer];
});
CVPixelBufferRef pixelBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer);
m_cameraSource->bufferCaptured(pixelBufferRef);
}
if(self.rtmpSessionState == kVCSessionStateNone) {
self.rtmpSessionState = kVCSessionStatePreviewStarted;
}
}
==> m_cameraSource->setOutput(m_videoSplit)
==> m_videoSplit->setOutput(m_h264Encoder);
==> m_h264Encoder->setOutput(m_h264Split);
==> m_h264Split->setOutput(m_h264Packetizer);
==> m_h264Packetizer->setOutput(m_outputSession);
void IOSRTMPSession::pushBuffer(const uint8_t* const data, size_t size, IMetadata& metadata){
dispatch_semaphore_wait(m_lock, DISPATCH_TIME_FOREVER);
if (!m_iConnectedFlag) {
dispatch_semaphore_signal(m_lock);
return ;
}
dispatch_semaphore_signal(m_lock);
const IOSRTMPMetadata_t inMetadata = static_cast<const IOSRTMPMetadata_t&>(metadata);
unsigned int uiMsgTypeId = inMetadata.getData<kIOSRTMPMetadataMsgTypeId>();
if((RTMP_PT_AUDIO != uiMsgTypeId) && (RTMP_PT_VIDEO != uiMsgTypeId)){
return;
}
char* pSendBuff = (char*)malloc(size);
if (pSendBuff == NULL) {
printf("malloc pSendBuff failed\n");
return;
}
memcpy(pSendBuff, data, size);
int dts = inMetadata.getData<kIOSRTMPMetadataTimestamp>();
int pts = inMetadata.pts;
int iret = ;
if(RTMP_PT_AUDIO == uiMsgTypeId){
iret = Librtmp_PutAudioBuffer(pSendBuff, (int)size, dts);
}else if (RTMP_PT_VIDEO == uiMsgTypeId){
iret = Librtmp_PutVideoBuffer(pSendBuff, (int)size , pts, pts);
}
if (iret != ) {
printf("\n put buffer error.\n");
}
free(pSendBuff);
}
2.
推流流程
使用rtmp协议(其他协议也类似)推流的大体流程如下:
- 通过系统相机捕获视频及声音,该美颜的美颜,该滤镜的滤镜。
- 捕获的视频帧为yuv格式,音频帧为pcm格式。
- 将捕获的音视频数据,传入一个串行队列(编码队列),在队列中进行编码操作。
- 将yuv格式视频数据,转成h264格式视频帧;将pcm格式音频数据,转成aac格式音频帧。
- 将转好的h264及aac格式数据,转成flv视频帧。放入编码缓冲区,待发送。继续获取视频帧并编码。
- 建立rtmp连接到服务器,成功后,创建另一个串行队列(发送队列)。
- rtmp协议,需要在首帧发送 sps/pps和AudioSpecificConfig这2种特别的帧数据。
- 发送了首帧之后,发送队列不停从编码队列中获取flv视频帧,发送至rtmp服务端。
- 结束直播,关闭推流,释放资源。
https://www.jianshu.com/p/77fea6e0eccb
@synchronized(self) {
if (self.previousPixelBuffer){
CFRelease(self.previousPixelBuffer);
self.previousPixelBuffer = nil;
}
self.previousPixelBuffer = CFRetain(pixelBuffer);
}
- (void)didResignActive{
NSLog(@"resign active");
[self setupPlayerBackgroundImage];
}
- (void) setupPlayerBackgroundImage{
if (self.isVideoHWDecoderEnable){
@synchronized(self) {
if (self.previousPixelBuffer){
self.image = [self getUIImageFromPixelBuffer:self.previousPixelBuffer];
CFRelease(self.previousPixelBuffer);
self.previousPixelBuffer = nil;
}
}
}
}
- (UIImage*)getUIImageFromPixelBuffer:(CVPixelBufferRef)pixelBuffer
{
UIImage *uiImage = nil;
if (pixelBuffer){
CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pixelBuffer];
uiImage = [UIImage imageWithCIImage:ciImage];
UIGraphicsBeginImageContext(self.bounds.size);
[uiImage drawInRect:self.bounds];
uiImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
return uiImage;
}
4.std:thread
void
GLESVideoMixer::start() {
m_mixThread = std::thread([this](){ this->mixThread(); });
}
https://www.github.com/runner365/LiveVideoCoreSDK/
3.ijkplayer
http://www.jianshu.com/p/a7d9ed02cf40
第11月第3天 直播 rtmp yuv的更多相关文章
- 11月30日《奥威Power-BI智能分析报表制作方法》腾讯课堂开课啦
这么快一周就过去了,奥威公开课又要与大家见面咯,上节课老师教的三种报表集成方法你们都掌握了吗?大家都知道,学习的结果在于实际应用,想要熟练掌握新内容的要点就在于去应用它.正是基于这一要点,每一期的课程 ...
- 11月23日《奥威Power-BI报表集成到其他系统》腾讯课堂开课啦
听说明天全国各地区都要冷到爆了,要是天气冷到可以放假就好了.想象一下大冷天的一定要在被窝里度过才对嘛,索性明天晚上来个相约吧,相约在被窝里看奥威Power-BI公开课如何? 上周奥威公开 ...
- 11月16日《奥威Power-BI基于SQL的存储过程及自定义SQL脚本制作报表》腾讯课堂开课啦
上周的课程<奥威Power-BI vs微软Power BI>带同学们全面认识了两个Power-BI的使用情况,同学们已经迫不及待想知道这周的学习内容了吧!这周的课程关键词—— ...
- 11月09日《奥威Power-BI vs微软Power BI》腾讯课堂开课啦
上过奥威公开课的同学可能有一个疑问:奥威Power-BI和微软Power BI是同一个吗,为什么叫同样的名字?正如这个世界上有很多个John.Jack.Marry…一样,奥威Power-BI和微软Po ...
- Android 如何直播RTMP流
在android上,视频/音频流直播是极少有人关注的一部分.每当我们讨论流媒体,RTMP(Real Time Messaging Protocol)是不可或缺的.RTMP是一个基本的视频/音频直播流协 ...
- 【阿里聚安全·安全周刊】阿里双11技术十二讲直播预约|AWS S3配置错误曝光NSA陆军机密文件
关键词:阿里双11技术十二讲直播丨雪人计划丨亚马逊AWS S3配置错误丨2018威胁预测丨MacOS漏洞丨智能风控平台MTEE3丨黑客窃取<权利的游戏>剧本|Android 8.1 本 ...
- Azure 11 月新公布
Azure 11 月新发布:Apple FairPlay Streaming, 应用服务(App Service), 虚拟机规模集(VMSS) Azure 媒体服务的 Apple FairPlay S ...
- 「P4996」「洛谷11月月赛」 咕咕咕(数论
题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...
- 11月1号开学! 《jmeter性能测试实战》崭新亮相!
课程介绍 第10期<jmeter性能测试实战>课程,11月2号开学!全新改版,和之前的课程框架完全不同 主讲老师:飞天小子 上课方式:每周六周日晚8点到10点,QQ群视频在线直播教学 本期 ...
随机推荐
- PAT甲题题解-1025. PAT Ranking (25)-排序
排序,求整体的排名和局部的排名整体排序,for循环一遍同时存储整体目前的排名和所在局部的排名即可 #include <iostream> #include <cstdio> # ...
- think in UML(一)
从一开始上课老师就讲面向对象设计面向对象设计,然而对于什么是面向对象是什么没有什么具体的概念,相较于面向对象设计,面向对象又有什么什么优势.<大象>从一开始就交代了我最基础的知识欠缺,在书 ...
- ElasticSearch 5.6.1 安装 Kibana、X-Pack和head
前面已经有写过ElasticSearch和iK的安装了这里就不在所了. 安装Kiabna 在下载tar包的时候需要注意下一安装的es版本号,按照官网的说明版本是对应一致的. https://www.e ...
- Alpha冲刺-第三天
1.1 今日完成任务情况以及遇到的问题. 完成任务情况 杜世康:使用正则表达式对于弹幕文本中的数字,字母,符号,非法字符等过滤. 刘丹,李玉莹:实现主播管理功能 曹莹雯,尹楠: 调用NLPIR/ICT ...
- CentOS 下运行Docker 内执行 docker build 命令的简单方法
1. 通过部分文档进行学习...主要知识来源 https://blog.csdn.net/shida_csdn/article/details/79812817 2. 下载 docker 的rpm包. ...
- 骑士 HYSBZ - 1040(基环树+树形dp)
Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中 ...
- 初识Java Enum
enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中. enum是关键字,感觉它跟class.interface是并列的,并且不能跟fi ...
- 【刷题】BZOJ 4543 [POI2014]Hotel加强版
Description 同OJ3522 数据范围:n<=100000 Solution dp的设计见[刷题]BZOJ 3522 [Poi2014]Hotel 然后发现dp的第二维与深度有关,于是 ...
- 【刷题】LOJ 6011 「网络流 24 题」运输问题
题目描述 W 公司有 \(m\) 个仓库和 \(n\) 个零售商店.第 \(i\) 个仓库有 \(a_i\) 个单位的货物:第 \(j\) 个零售商店需要 \(b_j\) 个单位的货物.货物供需平衡, ...
- 【BZOJ1005】[HNOI2008]明明的烦恼(prufer序列)
[BZOJ1005][HNOI2008]明明的烦恼(prufer序列) 题面 BZOJ 洛谷 题解 戳这里 #include<iostream> #include<cstdio> ...