欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流

程序员文章站 2022-06-04 23:41:22
...

最近项目中想实现直播的功能,所以研究了一段时间的直播功能,当然也是在别人的基础上不断的学习实现的,所以记录一下,希望对大家有所帮助。

直播拉流功能:

这里使用了开源的IJKPlayer第三框架,ijkplayer 是一款做视频直播的框架, 基于ffmpeg,是大多数搭建直播平台的首选框架,当然各大云平台都有自己的直播框架,具体大家使用的时候可以自行研究,有问题再留言,我这里不再说明框架的集成和拉流过程,具体的内容推荐两个链接,步骤比较齐全:

iOS中集成ijkplayer视频直播框架http://www.jianshu.com/p/1f06b27b3ac0

集成直播拉流的框架时间比较久,耐心等待一下,下面是集成时输出的部分内容:

iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流

iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流

iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流

打开终端, 进行合并, 命令行具体格式为:

打开终端,然后输入合并文件的终端命令,格式:
lipo -create 直接拖拽过来真机版本中的IJKMediaFramework文件 直接拖拽过来模拟器版本中的IJKMediaFramework文件 -output 直接拖拽过来一个保存将要生成文件的一个文件夹(可以在桌面上新建一个文件夹),然后在文件地址后面添加 /IJKMediaFramework
如果不理解,我建议在桌面上创建一个新的文件夹,然后将真机和模拟器版本的文件夹拖拽到新的文件夹中,然后进行上述的终端命令操作
如果输出的结果是error,而且生成的是以  .lipo结尾的文件,说明终端命令输入的有问题

lipo -create "真机版本路径" "模拟器版本路径" -output "合并后的文件路径"

iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流

如果输出这样的问题是:文件合并出现了问题,解决办法只能重新解压文件包,重新合并,一步一步来:

iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流

iOS直播拉流初窥:高仿<喵播APP>http://www.jianshu.com/p/b8db6c142aad

重点说一下nginx+rtmp服务器和协议的创建、推流过程:

首先需要搭建nginx+rtmp服务器:

    1. 打开终端, 查看是否已经安装了Homebrew, 直接终端输入命令
man brew

如果Mac已经安装了, 会显示一些命令的帮助信息. 此时输入Q退出即可, 直接进入第二步.
反之, 如果没有安装,执行命令

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

如果安装后, 想要卸载

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
  • 2.安装nginx

先clone nginx项目到本地

brew tap homebrew/nginx

执行安装:

brew install nginx-full --with-rtmp-module

此时, nginx和rtmp模块就安装好了
输入命令:

nginx

在浏览器里打开http://localhost:8080
如果出现下图, 则表示安装成功

iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流

iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流
安装成功

如果终端上提示

nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use)
.....

则表示8080端口被占用了, 查看端口PID

lsof -i tcp:8080

根据端口PID, kill掉(这儿的9603换成你自己8080端口的PID)

kill 9603

然后重新执行nginx, 打开http://localhost:8080

  • 3.配置nginx和ramp
    首先我们查看nginx安装到哪了
brew info nginx-full

如图, 找到nginx.conf文件所在位置

iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流
nginx.conf

通过vim或者点击Finder->前往->前往文件夹->输入/usr/local/etc/nginx/nginx.conf->打开nginx.conf(推荐使用文本编辑,当然只要打开可以编辑并保存就行)

直接滚到最后一行, 在最后一个}(即最后的空白处, 没有任何{})后面添加

# 在http节点后面加上rtmp配置:
rtmp {
    server {
        listen 1935;
        application rtmplive {
            live on;
            record off;
        }
    }
}

然后重启nginx(其中的1.12.0要换成你自己安装的nginx版本号, 查看版本号用nginx -v命令即可)

/usr/local/Cellar/nginx-full/1.12.0/bin/nginx -s reload
图:

iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流

如果出现问题,解决方案:
卸载nginx

brew uninstall nginx

再次安装nginx

brew install nginx-full --with-rtmp-module
    1. 安装ffmpeg

执行命令

brew install ffmpeg

安装ffmpeg时间就要长一点了. 如果速度过慢, 建议*. 不过也才50多M的东西, 耐心一点就好. 等待的时间里, 再安装一个支持rtmp协议的视频播放器VLC

安装命令输入后,会提示你 点击return或者任意键继续,同时需要输入电脑开机密码,没有直接敲回车
你可以在推流之前找到一个视频文件放在桌面上,然后推流查看的操作过程:先打开VLC,然后File—》open network —》输入:rtmp://localhost:1935/rtmplive/room,然后在终端输入推流命令:ffmpeg -re -i /Users/hbbhao/Desktop/login_video.mp4 -vcodec libx264 -acodec aac -strict -2 -f flv rtmp://localhost:1935/rtmplive/room,就会看到实时的效果

推流成功:

iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流

源码下载+使用方法:http://pan.baidu.com/s/1miFmD0s 好尴尬,文件有点大,GitHub上传不上去了,从百度云上下载吧,有问题可以留言。

拉流播放的地址替换:(本地IP地址查看方法:http://blog.csdn.net/hbblzjy/article/details/73250491)

iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流

推流地址替换:(本地IP地址查看方法:http://blog.csdn.net/hbblzjy/article/details/73250491)

iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流

如果输出了错误:

ERROR: PILI_RTMP_Connect0, failed to connect socket. 60 (Operation timed out)或者61(connect refuse)
ERROR: WriteN, PILI_RTMP send error 9, Bad file descriptor, (140 bytes)这类问题的解决办法:1、首先确认利用终端命令测试的推流已关闭,如果不确定输入终端命令exit推出,然后关闭终端;2、打开偏好设置选择安全与隐私关闭防火墙;3、修改ShowTimeViewController, 进入ShowTimeViewController.m. 搜索- (IBAction)living:(UIButton *)sender, 将里面的stream.url替换成你自己的IP地址即可,一定要使用IP地址,不能使用localhost代替,格式:rtmp://192.168.10.86(切记用数字ip):1935/rtmplive/room

重启nginx+rtmp服务器方法:

iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流