Mac搭建Nginx流媒体服务器,进行推流,拉流

Mac搭建Nginx流媒体服务器,进行推流,拉流,第1张

Nginx 是非常优秀的开源服务器,用它来做hls或者rtmp流媒体服务器是非常不错的选择

下面介绍如何在Mac上搭建流媒体服务器,以便后续的自己研究的项目或者demo向服务器上进行推流

首先需要安装brew,brew是一款管理软件的第三方平台,安装的方式也很简单,请自行查阅安装方式

执行下面2句命令,即可安装rtmp推流的nginx服务器

执行完后,可以查看ngix安装在哪里

可以看到M1 是安装在这个目录下/usr/local/etc/nginx

打开这个目录,可以看到有个nginx.conf文件,这里就是服务器的一个配置文件,如果支持rtmp,则里面的内容会有一个rtmp的json

这个json说明:

1.你本地的nginx服务器会监听1935端口号,

2.服务器会创建一个mytv的程序

后续你可以向这个地址进行推流,并且进行拉流播放

后面我们会使用ffmpeg向这个地址推流

rtmp://localhost:1935/mytv/room

并且用vlc拉取这个地址的流进行播放

执行命令,即可启动nginx服务器

验证是否启动成功,只需要在浏览器中访问下以下链接

在浏览器地址栏输入: http://localhost:8080

出现Welcome to nginx ,代表nginx安装成功了。

打开配置文件 /usr/local/etc/nginx/nginx.conf

这里推的是flv流,可以正常推,这里需要注意的是服务器地址一定要写正确,我的nginx.conf里application配置的是mytv,所以路径就是mytv,room则是随便写都行,代表向程序mytv下的room文件推流

然后电脑上打开vlc这个播放器软件 点击File---->Open Network 在弹出来的框中选择Network然后输入URL:

验证时,推流的文件最好搞大点,不然一下推完了,你才去拉取播放,则播放不了,因为这是实时的

vlc使用如下

3.点击播放即可

可以看到左边是画面,右边是ffmpeg在推流

参考: https://www.jianshu.com/p/cf74a34af15d

视频编码有几种方式:

1.硬编码,使用MediaCodec实现

2.软编码,使用FFmpeg或者libx264库来实现。

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

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

本文所使用FFmpeg的版本是4.1,关于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)

释放资源

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


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/96002.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存