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

  • 相关阅读:
    Python入门11 —— 基本数据类型的操作
    Win10安装7 —— 系统的优化
    Win10安装6 —— 系统的激活
    Win10安装5 —— 系统安装步骤
    Win10安装4 —— 通过BIOS进入PE
    Win10安装2 —— 版本的选择与下载
    Win10安装1 —— 引言与目录
    Win10安装3 —— U盘启动工具安装
    虚拟机 —— VMware Workstation15安装教程
    Python入门10 —— for循环
  • 原文地址:https://www.cnblogs.com/wintertone/p/10575896.html
Copyright © 2011-2022 走看看