美文网首页IOS即时通迅和直播橙红科技有限公司
【如何快速的开发一个完整的iOS直播app】(推流篇)

【如何快速的开发一个完整的iOS直播app】(推流篇)

作者: 袁峥 | 来源:发表于2016-10-18 21:19 被阅读12006次

前言

在看这篇之前,如果您还不了解直播原理,请查看这篇文章如何快速的开发一个完整的iOS直播app(原理篇)

开发一款直播app,肯定需要流媒体服务器,本篇主要讲解直播中流媒体服务器搭建,并且讲解了如何利用FFMPEG编码和推流,并且介绍了FFMPEG常见命令。

如果喜欢我的文章,可以关注我微博:袁峥Seemygo

效果

Snip20161018_20.png

一、安装Homebrew

Homebrew简称brew,是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件。

1、打开终端, 查看是否已经安装了Homebrew, 直接终端输入命令
* man命令:manual(手册)的缩写,可以查看某一命令的帮助信息,比如git,brew,顺便可以查看有没有按照这个命令.

man brew
man brew.png

2、 执行命令,安装Homebrew

  • 执行命令后,需要按回车,并且需要输入电脑密码。
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Homebrew.png

二、利用安装nginx

Nginx:Nginx是一个非常出色的HTTP服务器,其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。

  1. 从github下载Nginx到本地,增加home-brew对nginx的扩展
brew tap homebrew/nginx
brew tap.png

2.安装Nginx服务器和rtmp模块

brew install nginx-full --with-rtmp-module
Snip20161017_6.png

3.查看是否安装成功
在终端开启nginx服务器,输入一下命令

nginx
  • nginx:开启nginx服务器

在浏览器地址栏输入:http://localhost:8080 (直接点击)
如果出现下图, 则表示安装成功

Snip20161017_7.png

三、配置rtmp

1.查看nginx配置文件安装在哪

brew info nginx-full
Snip20161022_3.png Snip20161022_4.png
2.用xcode打开配置文件,滚动到最后面(最后一个}后面即可,不能在{}里面),添加一下代码,进行配置,最后记得保存 Snip20161022_5.png
rtmp {
    server {
        listen 1990;
        application liveApp {
            live on;
            record off;
        }
    }
}

Snip20161017_11.png
  • application:流媒体上应用名称,可以随意填
  • record off:图片有误,不记录数据

3.重新加载nginx的配置文件

nginx -s reload

四、安装ffmepg进行推流

brew install ffmpeg
Snip20161017_10.png

五、使用ffmepg推流测试

ffmpeg -re -i (视频全路径) -vcodec copy -f flv (rtmp路径

ffmpeg -re -i /Users/yuanzheng/Desktop/02-如何学习项目.mp4 -vcodec copy -f flv rtmp://localhost:1990/liveApp/room

  • 需要跟配置的一一对应,端口,应用名称,room可以随便写
  • 延时:发送流媒体的数据的时候需要延时。不然的话,FFmpeg处理数据速度很快,瞬间就能把所有的数据发送出去,流媒体服务器是接受不了的。因此需要按照视频实际的帧率发送数据
  • -re: 一定要加,代表按照帧率发送,否则ffmpeg会一股脑地按最高的效率发送数据
  • -i : 输入文件
  • -vcodec copy: 强制使用codec编解码方式,要加,否则ffmpeg会重新编码输入的H.264裸流
  • -f 强制转换为什么格式,后接格式
  • ffmpeg参数中文详细解释

六、使用VLC播放rtmp推流

1.下载VLC

2.打开VLC,输入直播地址,cmd + N

Snip20161018_15.png Snip20161018_16.png ![Uploading Snip20161018_20_411856.png . . .]

七、用ffmpeg抓取桌面以及摄像头推流进行直播

1.首先查看ffmpeg是否支持对应的设备,在OSX下面,Video和Audio设备使用的是avfoundation,所以可以使用avfoundation来查看

ffmpeg -f avfoundation -list_devices true -i ""
Snip20161018_13.png

2.抓取桌面和摄像头进行推流

ffmpeg -f avfoundation -framerate 30 -i "1:0" -f avfoundation -framerate 30 -video_size 640x480 -i "0" -c:v libx264 -preset slow -filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' -acodec libmp3lame -ar 44100 -ac 1  -f flv rtmp://localhost:1990/liveApp/room

  • -f avfoundation 转换为avfoundation
  • -framerate 30 : 设置帧率 30
  • -i "1:0" : 设置输出,视频:Capture screen 音频:Built-in Microphone
  • -f avfoundation -framerate 30 -video_size 640x480 : 设置帧率和视频尺寸
  • -c:v libx264 设置视频编码,H.264编码 优点是同等清晰度,视频文件更小 缺点就是转换慢
  • -c:v flv 标准FLV编码 这个好处是速度快 清晰度高的话 视频文件会比较大
  • -preset slow 使用慢速模式 延迟长 清晰度高
  • ffmpeg的转码延时测试与设置优化
  • -filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10':给视频打水印
  • -acodec libmp3lame 強制指定音频处理模式
  • -ac 1 声道选择
  • -ar 44100 音频赫兹

相关文章

网友评论

  • 寒翎:brew tap homebrew/nginx 报错了 说的homebrew/nginx弃用了 怎么办?
    需要药:https://blog.csdn.net/github_32521685/article/details/50194509
  • 2897b276a30f:问题同35L。。。-pix_fmts uyvy422 这样设置也没用
  • Mr_Chen_df25:楼主,执行最后一步ffmpeg -f avfoundation -framerate 20 -i "0:0" -f avfoundation -framerate 30 -video_size 640x480 -i "0" -c:v libx264 -preset slow -filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:1990/liveApp/room
    一直爆这个错误:
    ffmpeg version 3.3.3 Copyright (c) 2000-2017 the FFmpeg developers
    built with Apple LLVM version 8.1.0 (clang-802.0.42)
    configuration: --prefix=/usr/local/Cellar/ffmpeg/3.3.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --disable-lzma --enable-vda
    libavutil 55. 58.100 / 55. 58.100
    libavcodec 57. 89.100 / 57. 89.100
    [avfoundation @ 0x7fb166000000] Selected pixel format (yuv420p) is not supported by the input device.
    [avfoundation @ 0x7fb166000000] Supported pixel formats:
    [avfoundation @ 0x7fb166000000] uyvy422
    [avfoundation @ 0x7fb166000000] yuyv422
    [avfoundation @ 0x7fb166000000] nv12
    [avfoundation @ 0x7fb166000000] 0rgb
    [avfoundation @ 0x7fb166000000] bgr0
    [avfoundation @ 0x7fb166000000] Overriding selected pixel format to use uyvy422 instead.
    [avfoundation @ 0x7fb166000000] Stream #0: not enough frames to estimate rate; consider increasing probesize
    Input #0, avfoundation, from '1:0':
    Duration: N/A, start: 22354.938000, bitrate: N/A
    Stream #0:0: Video: rawvideo (UYVY / 0x59565955), uyvy422, 1920x1080, 1000k tbr, 1000k tbn, 1000k tbc
    Stream #0:1: Audio: pcm_f32le, 44100 Hz, stereo, flt, 2822 kb/s
    [avfoundation @ 0x7fb16687a000] Selected framerate (30.000000) is not supported by the device
    [avfoundation @ 0x7fb16687a000] Supported modes:
    [avfoundation @ 0x7fb16687a000] 160x120@[29.970000 29.970000]fps

    怎么处理?
    2897b276a30f:@Mr_Chen_df25 请问下,怎么解决的,谢谢
    Mr_Chen_df25:@乐问道 解决了
    2897b276a30f:请问有解决吗
  • 5f50d91b9bfa:我在推流的时候,使用LFLiveKit框架,在真机上总是崩溃,而且是崩溃在GPUImageView中的createDisplayFramebuffer方法里,我手机是iphone6 ,系统版本8.3,但是在模拟器上,因为没有摄像头,所以也没看到异常,网上所有的使用LFLiveKit的demo都是差不多的使用方法,不知道为什么?楼主,是否有遇到这种情况呢?
    5f50d91b9bfa:后来,用你的代码在我的真机上跑,也是同样的结果
  • iOS_aFei:大神你好,我看您的demo并没有FFmpeg推流这一块,这一块在客户端怎么实现?给个思路,谢谢!
  • TigerNong:楼主,你好!问你一个问题,就是我使用电脑本地推流是可以的,模拟器也是可以进行显示,但是在手机上推流和拉流都不行!请问一下这个是什么问题?
  • winterrain330:峥哥,有个问题请教下,我进行到推流测试时出现问题,一直报Connection to tcp://localhost:3017 failed (Connection refused), trying next address
    rtmp://localhost:3017/liveApp/room/123: Input/output error,我也尝试重启Nginx,但也没用,前面的配置都是正常的,这一步不知为什么,能否帮我分析下
    iOS小飞羊:遇见同样的问题,楼主解决了吗?
    joymake:配置错误了吧tcp应该是rtmp试试
    袁峥:@winterrain330 路径有错吗
  • 630c5eeb35d3:大神,想问下VLC播放rtsp,怎么能让VLC播放流畅呢,现在用VLC感觉很卡
  • Ausxin:请问我在VLC里面测试 测试不成功是怎么回事呢 求回复
  • 白水灬煮一切:大神你是做过直播软件吗?
  • 做一个有爱的伸手党:我重启nginx的时候一直提示deMacBook-Pro:~ beidou$ nginx -s reload
    nginx: [alert] could not open error log file: open() "/usr/local/var/log/nginx/error.log" failed (13: Permission denied)
    2017/02/15 16:18:37 [emerg] 2214#0: unknown directive "rtmp" in /usr/local/etc/nginx/nginx.conf:119这应该怎么弄啊 我手动输入也不行啊
    youth杨:检查下你的代码是不是把添加到ngix.conf中的设置rtmp的代码写到括号内了
  • 未来可期me:老师,ios退到后台,前台切换,恢复推流,总是失败,可能啥原因,我用的腾讯的
  • 0a7ea1459b80:请问一下,我在手机上采集摄像头,硬编码成H264,那么应该怎么推流到RTMP服务器呢
  • 65cb190bef16:你好,ffmpeg 用代码怎么完成推流
    65cb190bef16:@袁峥Seemygo 你好,我在使用LFLIveKit时会出现程序卡到音频编码中的这行代码:OSStatus result = AudioConverterNewSpecific(&inputFormat, &outputFormat, 2, requestedCodecs, &m_converter);不知道为什么?请高手指教,谢谢
    袁峥:@杨荣me 推流用librtmp
  • Ko_Neko:求助一下,如果用手机端 要如何推流?配置好服务器 ,然后我需要一个rtmp服务器地址,是否填自己的电脑的IP就可以了?框架是LFLiveKit
    Ko_Neko:@joymake 地址确实是填自己电脑的
    Ko_Neko:@joymake 好久之前搞的Demo了 记得似乎是解决了..但是忘记怎么弄的了...
    joymake:哥们试过了吗,我也在想呢,应该是配置ip+端口,关键是手机上采集后怎么推过来
  • 曲和之殇:无限递归桌面问题,求指导
  • irelia_TT:80端口被占用的情况下怎么搞?试了一些办法,都没有用啊,铮哥有没有提示?
  • a44ad246b1ca:推流端突然中断,在进去,客户端是怎么实现刷新的
  • 喵渣渣:好久没见峥哥动静了,一定在研究重要的东西
  • Ko_Neko:而且这个播放的时候回无限递归桌面 不知道是为什么呢
    Ko_Neko:@曲和之殇 没有-=-
    曲和之殇:无限递归桌面问题解决了吗?
    梨仔_Rosie:@IGARASHI 是的,同样的情况
  • Ko_Neko:可以播放,但是卡的吓人=-= 请问如何能只捕捉摄像头 不捕捉桌面呢?
    joymake:引号里字一个字符 是1代表屏幕,0代表camera,后面那个0是mic
    joymake:-i "1:0" 改成-i "0:0"
  • 可惜你不是我的双子座:用nginx推流,在vlc上可以顺利播放了
    那要如何用手机这边录,另外一端看呢?
  • 可惜你不是我的双子座:在使用VLC播放rtmp推流的时候
    [flv @ 0x7ff049800600] FLV does not support sample rate 48000, choose from (44100, 22050, 11025)
    [flv @ 0x7ff049800600] Audio codec mp3 not compatible with flv
    Could not write header for output file #0 (incorrect codec parameters ?): Function not implemented
    怎么解决
    LikeHeiDi:提示不是写了吗?flv格式不支持音频码率为48000的,只支持44100,22050,11025的,你得找一个音频码率为这三个中的其中一个的视频或者利用ffmpeg修改音频的码率
  • bagonfan:礼物篇啥时候出啊 期待礼物篇啊
  • lonelygo:前面步骤都没问题,本地视频rtmp推流vlc播放也正常,但是最后用摄像头直播推流,能打开Facetime 摄像头的绿灯,但是vlc不播放,过几秒ffmpeg退出。
    12 年 的MBA不支持 30 帧,降到25 也不行。烦请看看问题在哪,谢谢:

    $ ffmpeg -f avfoundation -framerate 30 -i "1:0" -f avfoundation -framerate 14.999993 -video_size 160x120 -i "0" -c:v libx264 -preset slow -filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:1990/liveApp/room

    [avfoundation @ 0x7fd7c8221a00] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
    [avfoundation @ 0x7fd7c8000000] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
    [flv @ 0x7fd7c9087400] Packets are not in the proper order with respect to DTS/s speed=0.829x
    av_interleaved_write_frame(): Invalid argument
    [flv @ 0x7fd7c9087400] Failed to update header with correct duration.
    [flv @ 0x7fd7c9087400] Failed to update header with correct filesize.
    微香惘爱:@lonelygo12年的MBA,降到25帧,也是在摄像头直播推流这里出现和你差不多的状况
    [avfoundation @ 0x7ff651008000] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
    [avfoundation @ 0x7ff652008600] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
    [flv @ 0x7ff65200c600] Packets poorly interleaved, failed to avoid negative timestamp -63 in stream 0.
    Try -max_interleave_delta 0 as a possible workaround.
    [flv @ 0x7ff65200c600] Packets are not in the proper order with respect to DTS
    av_interleaved_write_frame(): Invalid argument
    [flv @ 0x7ff65200c600] Failed to update header with correct duration.
    [flv @ 0x7ff65200c600] Failed to update header with correct file size.
    ...
    Conversion failed!
  • 柠檬草YF:装nginx 在 /usr/local/Cellar/nginx-full/1.10.2/bin/nginx,这个目录,版本 跟您讲的不一样,http://localhost:8080 这个地址一致 打不开,什么原因呢
  • Binboy_:不知道下个月小码哥在北京的进阶课是不是袁峥老师讲直播部分内容呢~
  • 58cb860debdd:$ brew link pcre
    Linking /usr/local/Cellar/pcre/8.39...
    Error: Could not symlink bin/pcre-config
    Target /usr/local/bin/pcre-config
    is a symlink belonging to pcre. You can unlink it:
    brew unlink pcre

    To force the link and overwrite all conflicting files:
    brew link --overwrite pcre

    To list all files that would be deleted:
    brew link --overwrite --dry-run pcre
    58cb860debdd:@XDKHAN 已解决,按照log的指令操作即可
  • 也许________:太牛逼 持续关注
  • 黑白灰的绿i:好想试试可惜没有服务器配合
  • Harvey002:搞起来了,不知道什么原因,延迟比较高,不止3秒。网上说rtmp延迟在1~3s,但我的明显超过3s
    if_you_like:@CocoaHui_ 你看一下配置是否正确,
    免免的酸菜鱼:@if_you_like 解决了么,我也是遇到这个情况
    if_you_like:连接到tcp:/ / localhost:1990失败(连接拒绝),尝试下一个地址 我的提示這個
  • 43bb147250a1:学习。
  • 陈阿票:进行到 “安装Nginx服务器和rtmp模块” 的时候发现了两个问题,首先是我之前是安装过 HomeBrew的,本来想直接安装 Nginx的,但是发现报错了,啥错给忘了,只要把 brew 更新到最新版本就好了,执行 brew update 。第二个问题是,进行安装的时候,提示了个错误“xcode-select: note: no developer tools were found at '/Applications/Xcode.app', requesting install. Choose an option in the dialog to download the command line developer tools”。其实我有 7.3 和 8.0 版本的 Xcode(7.3版本的命名为 Xcode.app,8.0版本的命名为Xcode8.app。因为必须命名不一样才能安装两个Xcode嘛)安装过程中,他是以命名的内容来选择 Xcode 进行配置的,并且必须为8.0版本。后来把两个版本的 Xcode 的命名方式交换一下就好了。
    陈阿票:@萌小菜 就是一开始服务器没有启动,自己手动启动一下就好了。
    萌小菜:@陈阿票 我的是一开始提示连接rtmp://localhost:1990/liveApp/room 提示refuse, 执行 brew services start homebrew/nginx/nginx-full后才能连接上服务器
    陈阿票:@陈阿票 并且在安装成功之后,需要执行 brew services start homebrew/nginx/nginx-full 才能真正的打开服务器。
  • Link913:第一,可惜雷哥劳累过度了,不然音视频还可以让他在讲解下
    GRIM:可惜了 天妒英才
    child_cool:@DeathOFDeath 挂墙上了那个人,很可惜
    5d51964693b5:@SkyHarute 哪个雷哥 有讲解视频吗 求网址

本文标题:【如何快速的开发一个完整的iOS直播app】(推流篇)

本文链接:https://www.haomeiwen.com/subject/klmtuttx.html