Android平台FFmpeg实现rtmp推流-C++的实现

Android平台FFmpeg实现rtmp推流-C++的实现,第1张

视频编码有几种方式:
1硬编码,使用MediaCodec实现
2软编码,使用FFmpeg或者libx264库来实现。

本文分享在Android平台视频编码-软编码的实现,也就是用FFmpeg来实现视频的编码,rtmp推流到服务器上,相机采集视频将在下一篇文章分享。

流媒体服务器使用 nginx-rtmp-module 来进行搭建。

本文所使用FFmpeg的版本是41,关于FFmpeg编译成Android平台so库如果有需要,我将在下一篇文章分享说明。

视频编码比较耗cpu,上传视频数据的会耗网络io,所以需要开启新线程去处理,这里我用HandlerThread来处理视频的编码上传。

初始化编码相关 *** 作
这里我们使用的是FFmpeg,所以在编码前我们会先做一些初始化以及参数设置工作。
FFmpeg初始化
av_register_all()
创建输出格式上下文
avformat_alloc_output_context2()
获取编码器
avcodec_find_encoder(AV_CODEC_ID_H264) 获取H264的编码器
设置编码器参数

使用给定的编码器和参数初始化编码上下文
avcodec_open2(pCodecCtx, pCodec, &param)
创建视频流
video_st = avformat_new_stream(ofmt_ctx, pCodec)
打开输出上下文
avio_open(&ofmt_ctx->pb, out_path, AVIO_FLAG_READ_WRITE)
写入输出头信息
avformat_write_header(ofmt_ctx, NULL)

像素格式转换
AV_PIX_FMT_YUV420P,它是纯平面存储。总共三个平面,分别存放,Y、U、V数据。
当图像宽是width,高是height时,Y分量的大小就是width×heitht,而U是width×heitht/4,V也是U是width×heitht/4。
H264编码
首先我们需要了解两个数据结构AVFrame、AVPacket
AVFrame存放的是原始数据、AVPacket存放的是编码后的数据。
创建AVPacket
av_new_packet(&enc_pkt, picture_size);
开始编码
ret = avcodec_encode_video2(pCodecCtx, pFrameYUV);
输出一帧编码后的视频数据
ret = av_write_frame(pCodecCtx, &enc_pkt);

释放资源

小伙伴们有疑问的可以在下方评论区评论。

播放一个RTMP协议的流媒体需要经过以下几个步骤:握手,建立连接,建立流,播放。RTMP连接都是以握手作为开始的。建立连接阶段用于建立客户端与服务器之间的“网络连接”;建立流阶段用于建立客户端与服务器之间的“网络流”;播放阶段用于传输视音频数据。
2 握手(HandShake)
一个RTMP连接以握手开始,双方分别发送大小固定的三个数据块
a) 握手开始于客户端发送C0、C1块。服务器收到C0或C1后发送S0和S1。
b) 当客户端收齐S0和S1后,开始发送C2。当服务器收齐C0和C1后,开始发送S2。
c) 当客户端和服务器分别收到S2和C2后,握手完成。

先要看看你是用哪种邮箱!
对应的邮箱不同,其填写的方式也稍微有些不同,不过大致都是一样
邮箱收发服务器(pop3\stmp)设置
163邮箱
POP3服务器:POP163COM
SMTP服务器:SMTP163COM
yahoo邮箱
注意:yahoo在foxmail 41以上的版本设置如下:( outlook 不行哟~)
POP3服务器:popmailyahoocomcn
SMTP服务器:smtpmailyahoocomcn
sohu邮箱
POP3服务器:pop3sohucom
SMTP服务器:smtpsohucom
Gmail邮箱
第一步:要手动配置: POP3服务器是popgmailcom
SMTP服务器是smtpgmailcom
第二步:使用自动配置文件 >

可以基于支持无线视频流云端推送的WiFi模块来实现:

方案构成:无线视频流云端推送方案由USB摄像头,QCA9531 WiFi模块、云端视频服务器及接收视频的手机组成。

方案设计:在网络USB摄像头的PCB板上,嵌入QCA9531 WiFi模块,通过USB接口将摄像头连接到WiFi模块,WiFi模块将摄像头采集的视频传输上传到云端视频服务器,并提供视频播放地址,用户通过手机端访问播放地址即可实时播放视频。

工作原理:用户在云端架设好云端视频服务器,通过WiFi模块采集USB摄像头视频内容,并将视频数据上传到云端视频服务器;手机端通过访问云端视频服务器提供的播放地址,获取视频流,实时查看USB摄像头采集的视频。

硬件准备:一台电脑,一根网线,一个UVC免驱动摄像头,一块SKW99模块,一块SKW99 EVB板,DC适配器,两根WiFi模块天线

接线:摄像头通过USB连接到WIFI模块,WIFI通过无线中继或WAN口或4G/5G模块上网将摄像头采集的数据上传到服务器,下图是方案演示接线图,此处使用无线中继上网,将摄像头采集的数据上传到服务器。

网页配置:申请云平台账号(支持主流云平台,本篇以腾讯云直播平台为例),开通云直播,注册推流域名,播放域名,并对域名进行备案和解析;

在腾讯云直播上创建推流地址,并在WIFI模块的对应界面配置相应信息,主要是摄像头参数信息和视频服务器信息;

使用VLC查看推流结果,若是使用腾讯云推流,则播放如图一:使用腾讯云推流后,配置播放地址后的配置,按上图的播放地址,在VLC的“网络”中输入上面的播放地址,如下图进行播放。

若是腾讯云直播服务器推流,可通过微信关注“腾讯云视频云”小程序,打开小程序按下图 *** 作;

嵌入式RTMP/RTSP协议,可独立推流到流媒体服务器;

UVC免驱摄像头挂载,摄像头可支持H264/MJPG/YUYV视频格式;

支持720P@30帧/130万像素,本地视频服支持1080P@30帧/200万像素;

自己写解码264文件,如果用view显示,就需要转成bitmap显示,或者使用opengl可以显示yuv数据
如果已经保存成MP4格式的文件,就不需要解码了,通过mediaplayer就能播

小鸟云服务器niaoyun实例创建好之后,您可以使用以下任意一种方式登录服务器:
远程桌面连接(MicrosoftTerminalServicesClient,MSTSC):采用这种方式登录,请确保实例能访问公网。如果在创建实例时没有购买带宽,则不能使用远程桌面连接。
管理终端VNC:无论您在创建实例时是否购买了带宽,只要您本地有网页浏览器,都可以通过管理控制台的管理终端登录实例。
使用远程桌面连接(MSTSC)登录实例
打开开始菜单>远程桌面连接,或在开始菜单>搜索中输入mstsc。也可以使用快捷键Win+R来启动运行窗口,输入mstsc后回车启动远程桌面连接。
在远程桌面连接对话框中,输入实例的公网IP地址。单击显示选项。
输入用户名,如小鸟云默认为niaoyun。单击允许我保存凭据,然后单击连接。这样以后登录就不需要手动输入密码了。

这两天我就在试玩Adobe Media Server 5 extend,流媒体服务所用的环境就是一台win7 64位旗舰版的i5 24GHz、4G内存Dell笔记本,3个独立IP的测试发布终端(Wirecast、Adobe live media encoder、Matrox MonarchHD)都以RTMP协议往服务器中发布直播流,除了MonarchHD因为只具有有线接入外,全部设备包括AMS所在的笔记本都用无线AP接入一个局域小网。其中MonarchHD publish给笔记本中安装的AMS推送一个2M码流的1920x1080 i50 H264直播流,用各种接收终端接收流都很清晰流畅
我的服务器用的是小鸟云的,很稳定,流畅。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/12703880.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存