zoukankan      html  css  js  c++  java
  • Linux直播推流

    Linux系统实现youtube推流直播

    系统:centos-7-x64 (32位系统选择不同源下载安装,下载网址见最后)

    软件:FFMPEG, youtube-dl

    1. 安装FFMPEG

    创建并cd到一个目录,下载最新的FFMPEG(下面是64位,32位需分别下载 https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-i686-static.tar.xz https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-i686-static.tar.xz.md5)

    $ cd /home/john

    $ wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-amd64-static.tar.xz

    $ wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-amd64-static.tar.xz.md5

    下载完成后,可以检查完整性

    $ md5sum -c ffmpeg-git-amd64-static.tar.xz.md5
    ffmpeg-git-amd64-static.tar.xz: OK

    解压(有可能需要解压两次,我解压一次就可以了),如果遇到“tar (child): xz: Cannot exec: No such file or directory”,需安装xz,命令“yum -y xz”

    $ tar xvf ffmpeg-git-amd64-static.tar.xz

    现在得到目录”ffmpeg-git-20180203-amd64-static“(日期为最新版本日期,使用命令ls -a“查看当前目录所有目录文件)

    $ ls ffmpeg-git-20180203-amd64-static
    ffmpeg ffprobe GPLv3.txt manpages model qt-faststart readme.txt

    阅读readme.txt(hit "q" to exit out of "less")

    $ less ffmpeg-git-20180203-amd64-static/readme.txt

    使用相对路径

    $ pwd
    /home/john

    $ ./ffmpeg-git-20180203-amd64-static/ffmpeg
    ffmpeg version N-89948-ge3d946b3f4-static https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2018 the FFmpeg developers
    built with gcc 6.4.0 (Debian 6.4.0-11) 20171206
    (snipped output to save space)

    或者使用绝对路径

    $ pwd
    /home/john

    $ /home/john/ffmpeg-git-20180203-amd64-static/ffmpeg
    ffmpeg version N-89948-ge3d946b3f4-static https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2018 the FFmpeg developers
    built with gcc 6.4.0 (Debian 6.4.0-11) 20171206
    (snipped output to save space)

    要全局安装它,我需要将二进制文件移动到shell的路径中。“PATH”是环境中的一个变量,它被设置为shell用来定位二进制文件的冒号分隔目录列表。这是我的系统路径。

    $ echo $PATH
    /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/john/.local/bin:/home/john/bin

    检查是否安装旧版本

    $ whereis ffmpeg
    ffmpeg: /usr/bin/ffmpeg

    这列出了安装在/usr/bin中的较老版本的ffmpeg。我可以卸载旧版本,或者将新的ffmpeg二进制文件放在/usr/bin之前搜索的路径中。应该是/usr/local/bin

    将二进制文件ffmpeg和ffprobe移动到shell的路径中(sudo自行搜索安装,也可以直接mv,但比较麻烦)

    $ sudo mv ffmpeg-git-20180203-amd64-static/ffmpeg ffmpeg-git-20180203-amd64-static/ffprobe /usr/local/bin/

    $ whereis ffmpeg
    ffmpeg: /usr/local/bin/ffmpeg

    $ whereis ffprobe
    ffprobe: /usr/local/bin/ffprobe

    安装完成了

    $ ffmpeg
    ffmpeg version N-89948-ge3d946b3f4-static https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2018 the FFmpeg developers
    built with gcc 6.4.0 (Debian 6.4.0-11) 20171206
    (snipped output to save space)

    卸载(当然安装是用不到的)

    $ sudo rm /usr/local/bin/ffmpeg /usr/local/bin/ffprobe

    2.安装youtube-dl

    $ pip install youtube-dl

    3.推流

    $ youtube-dl -f best $URL -o - | ffmpeg -re -i pipe:0 -c:v copy -c:a aac -f flv $RTMP

    $RTMP为rtmp地址+直播码,需要加引号""

    但是断开连接后推流会停止,在命令最后加 & 保持后台运行

    备注:

    1)使用youtube-dl下载视频的命令:youtube-dl -f best jNQXAC9IVRw

      这个命令使用 -f best 参数寻找最佳画质,jNQXAC9IVRw 作为视频的番号告诉 youtube-dl 你想要下载哪个视频。

    2)使用streamlink 播放视频的命令:streamlink $URL best

      这个命令中 best 参数告诉了你想寻找最佳画质的资源, $URL 作为视频的播放地址告诉 streamlink 你想要播放哪个网页上的视频。如果你的电脑上安装了ffplay、ffmpeg等软件,还可以使用 --player=ffplay 指定你要使用哪个播放器播放,这里就用 ffplay 播放器。

    3)使用ffmpeg推流的命令:cat example.mp4 | ffmpeg -re -i pipe:0 -c:v copy -c:a aac -f flv $RTMP

      这个命令将告诉 cat 程序从你想要播放的视频文件中读取数据,| 符号表示创建一个从 cat 程序到 ffmpeg 程序的数据管道,将视频源源不断地传输过去。之后的参数中,-i pipe:0 参数告诉 ffmpeg 要从数据管道中读取数据。

      -re 参数:表示告诉 ffmpeg 要按照视频正常播放的帧数来处理。

      -i 参数:表示告诉 ffmpeg 要从什么地方读取媒体流数据。这里,pipe:0 是从管道读取数据,pipe:1 是向管道写入数据。

      -c 参数:告诉 ffmpeg 编码方案。这里的 -c copy 表示完全拷贝,如果使用 -c:v copy -c:a aac ,则表示只拷贝视频,而音频使用 aac 格式重新编码。

      -f 参数:表示文件的输入输出位置。这里的 -f flv 表示输出为 flv 格式,$RTMP 表示推流到BILIBILI直播网站的地址,这里就替换成完整的直播间 RTMP 推流地址。

    举例:

    1)从 Youtube 转播到 BILIBILI:youtube-dl -f best $URL -o - | ffmpeg -re -i pipe:0 -c:v copy -c:a aac -f flv $RTMP

      这是一个简单的转播案例,使用UNIX的通信管道,简单地将 youtube-dl 下载的媒体流转发给 ffmpeg,此时 ffmpeg 只做简单的音频转码和格式处理就把媒体流发送到BILIBILI直播间的RTMP推流地址上。由于行为十分简单,计算机资源占用极少。

    2)从 Ustream 转播到 BILIBILI:streamlink $URL best -O | ffmpeg -re -i pipe:0 -c copy -f flv $RTMP

      这是一个简单的转播案例,使用UNIX的通信管道,简单地将 streamlink 下载的媒体流转发给 ffmpeg,此时 ffmpeg 只做简单的镜像拷贝就把媒体流发送到BILIBILI直播间的RTMP推流地址上。同样由于行为十分简单,计算机资源占用极少。

    3)从 Youtube 转播到任意RTMP服务器:youtube-dl -f best $URL -o - | ffmpeg -re -i pipe:0 -c:v copy -c:a aac -f flv $RTMP

      这个例子和前面两个别无二致,只需要替换 $RTMP 地址即可。


    参考:

    https://www.bilibili.com/read/cv2184009

    https://www.johnvansickle.com/ffmpeg/faq/

    https://www.johnvansickle.com/ffmpeg/

    https://blog.csdn.net/heng4719/article/details/79105994

  • 相关阅读:
    jquery选择器 之 获取父级元素、同级元素、子元素
    Jquery知识小点备注
    如何使用strace+pstack利器分析程序性能
    Mysql 多列形成主键(复合主键 )
    Javascript 查找元素
    .gitignore规则不生效的解决办法
    Qt之模型/视图(自定义按钮)
    Qt之QTableView显示富文本
    CSS3之创建透明边框三角
    Qt之QHeaderView自定义排序(获取正确的QModelIndex)
  • 原文地址:https://www.cnblogs.com/wintertone/p/10575896.html
Copyright © 2011-2022 走看看