服务器FFmpeg推流实现不间断直播

直播在今天已经成了潮流,但是有时候总有一些奇怪的需求:

  1. 我的机器配置烂死了,无法做到 x264 实时压制推流,我只想复制视频流放电影、做个音乐点歌台……
  2. 我想在服务器上无人值守转播其他赛事(内容)。

Oh,这时候你需要 FFmpeg 了。

FFmpeg 安装

参考 《FFmpeg编译安装手记》

FFmpeg 实现推流

以 BiliLive 为例:

在B站的个人中心的开播设置中开启直播间,获取到rtmp地址和直播码,然后运行命令就可以开始直播:

ffmpeg -re -i "test.mp4" -vcodec copy -acodec aac -b:a 192k -f flv "你的rtmp地址/你的直播码"

其中的参数:

ffmpeg
-re:按照视频的FPS进行推流
-i:指定输入文件地址,可以是本地的视频路径,也可以是网络上的视频真实地址(实现转播)
-vcodec copy:指定视频编码为复制
-acodec aac:音频使用 aac 编码
-b:a 192k:表示上传码率
-f flv:表示推流使用的数据格式(一般来说都是Flv)

还可以实现更多的转播方式,参考FFmpeg官方的Wiki: >传送门

标签: FFmpeg, 直播, 推流, 转播, Bilibili, RTMP

添加新评论

已有 14 条评论

  1. Aretha Aretha

    I like the helpful info you provide in your articles. I'll bookmark your weblog and
    check again here frequently. I am quite certain I will
    learn a lot of new stuff right here! Best of luck for the next!

  2. 小彦 小彦

    好像记得FFmpeg不能一直流直播下去的,因为保存的文件会越来越大,直到服务器硬盘耗尽……当时我解决不了这个问题,只好3分钟3分钟地转码……

    1. Syc Syc

      推流是本地文件推上去,转推也不需要保存文件,FFMPEG自己处理临时文件不断覆盖数据,参数可以自定义临时文件大小。

  3. shin shin

    要是想循环推流怎么弄 我查的是用-steam_loop -1 但是一直报错。
    Unrecognized option 'stream_loop'.
    Error splitting the argument list: Option not found
    就是这两句
    ffmpeg版本是2.8.11

    1. Syc Syc

      注意检查命令,你少了一个r ,正确:-stream_loop -1

      1. shin shin

        fmpeg -re -stream_loop -1 -i output.mp4 ffmpeg version 2.8.11-0ubuntu0.16.04.1 Copyright (c) 2000-2017 the FFmpeg developers
        built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 20160609
        configuration: --prefix=/usr --extra-version=0ubuntu0.16.04.1 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv
        libavutil 54. 31.100 / 54. 31.100
        libavcodec 56. 60.100 / 56. 60.100
        libavformat 56. 40.101 / 56. 40.101
        libavdevice 56. 4.100 / 56. 4.100
        libavfilter 5. 40.101 / 5. 40.101
        libavresample 2. 1. 0 / 2. 1. 0
        libswscale 3. 1.101 / 3. 1.101
        libswresample 1. 2.101 / 1. 2.101
        libpostproc 53. 3.100 / 53. 3.100
        Unrecognized option 'stream_loop'.
        Error splitting the argument list: Option not found

        1. Syc Syc

          ffmpeg的问题一般要实际排查。建议使用脚本循环推流。
          for((;;)); do \ ffmpeg -re -i "H:\video.mp4" \ -c copy \ -f flv -y rtmp://10.100.1.8:1935/live/test001; \ sleep 1; \ done

          1. shin shin

            找到原因了,是16.04官方源的ffmpeg版本太低了,更新到最新版就没事了

            1. Syc Syc

              嗯嗯,建议使用编译安装,自带的包总是有奇怪的问题

          2. shin shin

            好吧,我再去看看

  4. 云武 云武

    CPU 占用一般维持在多少范围?

    1. Syc Syc

      主要和码率有关系,推流720p-H.264在60%左右,如果单纯音频和图片的话应该非常低。
      也可以试试看 -threads 2 参数,限制线程,降低CPU使用率非常显著。

      1. 云武 云武

        目前暂时使用I3 2310 Windows 平台 OBS 进行推流测试(图片+音频),码率1000,CPU 占用基本 40% 左右,有机会会测试一下视频推流和 linux。

        1. Syc Syc

          推荐Linux,Win在底层内存调度上先天优势不足,不好压榨极限。