Code Monkey home page Code Monkey logo

awlive's Introduction

blog点这里

介绍

最近在做iOS直播,研究了相关直播技术,主要包含两方面:推流,播放。

因为之前使用cocos2dx做过一个视频游戏(恋爱公寓),用ffmpeg+sdl+cocos2dx实现过视频播放器。

游戏中的视频是hevc(h265)+aac合成mp4文件,使用aes加密。视频播放的时候,需要使用ffmpeg中的crypt模块进行aes解密后播放视频,解析出来的yuv图片数据直接送给OpenGL显示。

所以这次主要研究推流技术。并将代码开源

其实直播技术中不论播放还是推流,更多的应该算是技术整合,就是将前人做好的协议和实现,整合成我们自己想要的功能。

而这次做这个项目也并不是做了什么技术创新,github里面已经有着很多直播源代码,可能比我写的更好更完整。而我的代码,特点就是简单直接,直奔主题。

我会在我的博客里做一些简单的解析,目的是希望让更多的人了解直播技术,能够了解直播内部的一些简单的原理,不再知其然不知其所以然。

功能范围

  • 视频捕获:系统方法捕获,GPUImage捕获,CMSampleRef解析
  • 美颜滤镜:GPUImage,
  • 视频变换:libyuv
  • 横屏直播
  • 软编码:faac,x264
  • 硬编码:VideoToolbox(aac/h264)
  • libaw:C语言函数库
  • flv协议及编码
  • 推流协议:librtmp,rtmp重连,rtmp各种状态回调

代码使用及注意

代码使用方法见Demo。后续会根据上述功能的每一点对源代码进行解析。

如果有什么疑问或者问题,请评论指出,希望能够给愿意了解直播技术的人抛出一块好砖。

注1:项目中所有相关的文件名,类名,全局变量,全局方法都会加AW/aw作为前缀。 注2:项目中关键代码都使用c语言编写,理论上可以很容易地移植到android中。

awlive's People

Contributors

hardman avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

awlive's Issues

为什么要转换

我注意到 在使用系统相机的情况下, 需要先将摄像头捕捉到的数据 CVImageBufferRef 转为 NSData(NV12 数据排列格式), 然后在H264 编码时候, 又将 NSData(NV12 数据排列格式) 转为 CVImageBufferRef, 既然这样, 为什么不直接使用 CVImageBufferRef 呢? 求解...

无法连接到rtmp,请帮忙看下。谢谢!

2017-03-06 16:00:52.669313 BroadCast[5955:319877] [OC] rtmp state changed from(aw_rtmp_state_idle), to(aw_rtmp_state_connecting)
2017-03-06 16:00:52.669682 BroadCast[5955:319838] 连接中
ERROR: RTMP_Connect0, failed to connect socket. 65 (No route to host)
aw rtmp closing.......

aw rtmp closed.......

2017-03-06 16:00:52.671246 BroadCast[5955:319877] [OC] rtmp state changed from(aw_rtmp_state_connecting), to(aw_rtmp_state_closed)
2017-03-06 16:00:52.671383 BroadCast[5955:319838] 已关闭
2017-03-06 16:00:52.671538 BroadCast[5955:319877] [OC] rtmp state changed from(aw_rtmp_state_closed), to(aw_rtmp_state_idle)
aw rtmp closing.......

[d] closed rtmp context
2017-03-06 16:00:52.671630 BroadCast[5955:319838] 未连接
2017-03-06 16:00:52.671664 BroadCast[5955:319877] [OC] rtmp state changed from(aw_rtmp_state_idle), to(aw_rtmp_state_error_open)
2017-03-06 16:00:52.671749 BroadCast[5955:319877] [OC] rtmp state changed from(aw_rtmp_state_error_open), to(aw_rtmp_state_idle)
2017-03-06 16:00:52.671768 BroadCast[5955:319838] 连接错误
2017-03-06 16:00:52.671816 BroadCast[5955:319877] [OC] rtmp state changed from(aw_rtmp_state_idle), to(aw_rtmp_state_error_net)
2017-03-06 16:00:52.671875 BroadCast[5955:319838] 未连接
2017-03-06 16:00:52.671906 BroadCast[5955:319877] [OC] rtmp state changed from(aw_rtmp_state_error_net), to(aw_rtmp_state_idle)
2017-03-06 16:00:52.671959 BroadCast[5955:319877] startCapture rtmpOpen error!!! retcode=0
2017-03-06 16:00:52.671997 BroadCast[5955:319838] 网络不给力
aw rtmp closing.......

[d] closed rtmp context
2017-03-06 16:00:52.672059 BroadCast[5955:319838] 未连接

崩溃问题

你好
在切换成软编码的后,尝试多次开始直播关闭直播后,在aw_x264.c里面会崩溃在219行的x264_picture_clean(ctx->pic_in);
请知悉。

不断开关直播时,出现的,不是必现的

楼主你好

楼主你好问一下,怎么不更新了?

@setDataFrame missing

标准的FLV视频还需要设置一个MetaData。在发送sequential header之前可以进行发送,似乎不设置这个,普通的flv播放器会播放不了。

home键退到后台无法继续推流

退到后台之后就无法进行推流了 权限都已经添加 for (id currentTarget in targets) targets size一直是1 正常的时候size是2

ERROR: RTMP_Connect0, failed to connect socket. 65 (No route to host)

真机6s iOS13.4,本地nginx测试,地址也填了电脑地址
错误:
ERROR: RTMP_Connect0, failed to connect socket. 65 (No route to host)
aw rtmp closing.......

aw rtmp closed.......

2020-04-17 18:49:45.517451+0800 AWLive[24612:3841936] [OC] rtmp state changed from(aw_rtmp_state_connecting), to(aw_rtmp_state_closed)
2020-04-17 18:49:45.518377+0800 AWLive[24612:3841936] [OC] rtmp state changed from(aw_rtmp_state_closed), to(aw_rtmp_state_idle)
aw rtmp closing.......

[d] closed rtmp context
2020-04-17 18:49:45.519529+0800 AWLive[24612:3841936] [OC] rtmp state changed from(aw_rtmp_state_idle), to(aw_rtmp_state_error_open)
2020-04-17 18:49:45.520548+0800 AWLive[24612:3841936] [OC] rtmp state changed from(aw_rtmp_state_error_open), to(aw_rtmp_state_idle)
2020-04-17 18:49:45.521338+0800 AWLive[24612:3841936] [OC] rtmp state changed from(aw_rtmp_state_idle), to(aw_rtmp_state_error_net)
2020-04-17 18:49:45.522171+0800 AWLive[24612:3841936] [OC] rtmp state changed from(aw_rtmp_state_error_net), to(aw_rtmp_state_idle)
2020-04-17 18:49:45.523620+0800 AWLive[24612:3841936] startCapture rtmpOpen error!!! retcode=0
aw rtmp closing.......

[d] closed rtmp context

ffmpeg+sdl+cocos2dx

你好,我近期也在使用ffmpeg+sdl+cocos2dx方案,现在显示视频和播放音频都OK了,但是经常声音有噪音,尤其是播放网络视频网速不好的时候,不知道你有遇到并解决过这类问题吗?

编译问题

ld: warning: ignoring file /Users/huangchp/Downloads/AWLive-master/clibs/3th-party/libyuv/lib/libyuv.a, missing required architecture x86_64 in file /Users/huangchp/Downloads/AWLive-master/clibs/3th-party/libyuv/lib/libyuv.a (2 slices)
Undefined symbols for architecture x86_64:
"_ARGBToNV12", referenced from:
-[AWGPUImageAVCaptureDataHandler newFrameReadyAtTime:atIndex:] in AWGPUImageAVCapture.o
"_I420ToNV12", referenced from:
-[AWVideoEncoder rotateNV12Data:] in AWVideoEncoder.o
"_NV12ToI420Rotate", referenced from:
-[AWVideoEncoder rotateNV12Data:] in AWVideoEncoder.o
ld: symbol(s) not found for architecture x86_64

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.