Typecho的编辑器居然是靠缩进来识别格式,我非常不习惯,排版很烂,请见谅。

条件

  1. 国外vps一台
    我是用的是vultr的服务器,最低配版(但不能只支持IPv6!)。
  2. 国内vps一台
    我看了挺多,最后用的腾讯云学生版,最低配,带宽5M。
  3. 拥有一定Linux知识或者懂得Google

原理

  请参考:
https://github.com/LetMeDecay/bilibili_live_foreign_stream_solution

  问题关键在于绕开bilibili对国外流的限制,而这位前辈给出的解决方案虽然是国外直播到bilibili,但我们其实完全可以拿来用。
  我这里的逻辑是:

[youtube] -> [vultr] -> [TencentServer] -> [bilibili]

配置

  • 1.配置国外vps
  • 1.1安装NGINX+rtmp

  我的是centos7,但是似乎Debian会好用很多,在安装NGINX和rtmp时,Debian似乎一行就能解决,但centos需要编译安装,非常的麻烦。
  https://www.howtoforge.com/tutorial/how-to-install-nginx-with-rtmp-module-on-centos/
  这里做完step4就可以,由于我们不需要像前文那样反复在服务器之间推流,所以这一步rtmp的配置完全可以免去。

  出问题多Google。

  • 1.3安装youtube-dl

  不记得是怎么装的了,这就意味着这没太大麻烦,请自行Google。

  • 2.配置国内vps

  依旧是centos7,安装ffmpeg后,照做1.1到step5,但是链接里面config的配置这样写(vim nginx.conf以后,i进入编辑模式,文档底部会出现insert,然后把下面这部分编辑好复制进去,esc,输入:wq!保存更改,或输入:q!放弃更改):

    worker_processes  auto;
    events {
        worker_connections  1024;
    }
    
    # RTMP configuration(这是唯一需要改的部分)
    rtmp {
        server {
                listen 1935;#保持默认
                chunk_size 128; 
    
                application testmusic {#testmusic是我随便起的应用名
                    live on;
                    exec_push ffmpeg -i rtmp://127.0.0.1:1935/testmusic -c copy -f flv rtmp://live-push.bilivideo.com/live-bvc/[你的直播码];#ffmpeg参数可调
                }
        }
    }
    http {
        sendfile off;
        tcp_nopush on;
        aio on;
        directio 512;
        default_type application/octet-stream;
    
        server {
            listen 8080;
    
            location / {
                # Disable cache
                add_header 'Cache-Control' 'no-cache';
    
                # CORS setup
                add_header 'Access-Control-Allow-Origin' '*' always;
                add_header 'Access-Control-Expose-Headers' 'Content-Length';
    
                # allow CORS preflight requests
                if ($request_method = 'OPTIONS') {
                    add_header 'Access-Control-Allow-Origin' '*';
                    add_header 'Access-Control-Max-Age' 1728000;
                    add_header 'Content-Type' 'text/plain charset=UTF-8';
                    add_header 'Content-Length' 0;
                    return 204;
                }
    
                types {
                    application/dash+xml mpd;
                    application/vnd.apple.mpegurl m3u8;
                    video/mp2t ts;
                }
    
                root /mnt/;
            }
        }
    }

  在bilibili开播设置里面找到直播码:

  • 3.bilibili开启直播

  开了以后一段时间要是没有推流,直播会自动关闭,注意重开。

  • 4.开始推流
  • 4.1推流YouTube频道

  在国外vps的ssh操作。这里给出几个推流指令。

  • 4.1.1 获取视频流
  [root@vultrguest ~]# youtube-dl -g https://www.youtube.com/watch?v=5qap5aO4i9A
    https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1621121035/ei/qwOgYL7rJ4ip8wSLobrICw/ip/108.61.148.107/id/5qap5aO4i9A.0/itag/96/source/yt_live_broadcast/requiressl/yes/ratebypass/yes/live/1/sgoap/gir%3Dyes%3Bitag%3D140/sgovp/gir%3Dyes%3Bitag%3D137/hls_chunk_host/r2---sn-ab5sznly.googlevideo.com/playlist_duration/30/manifest_duration/30/vprv/1/playlist_type/DVR/initcwndbps/6250/mh/30/mm/44/mn/sn-ab5sznly/ms/lva/mv/m/mvi/2/pl/23/dover/11/keepalive/yes/fexp/24001373,24007246/mt/1621099225/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,live,sgoap,sgovp,playlist_duration,manifest_duration,vprv,playlist_type/sig/AOq0QJ8wRQIhAJ9iCWlZfMYJafd3TN9XDeoHd5E88ZUxwkw7xL6fDTTRAiBJhCaS-rML--ydkHcKy-qaDB9gqTpIyEskNRqwlZI0Qw%3D%3D/lsparams/hls_chunk_host,initcwndbps,mh,mm,mn,ms,mv,mvi,pl/lsig/AG3C_xAwRgIhANdlPVyQXVjnSK3LSN5B7nv_fkJycUWoZye6ZWx6fIGnAiEAxEn0cW250fZopvzZO0Dkt635fPH5yHOo9aLgkLhXg4E%3D/playlist/index.m3u8
  • 4.1.2 用获取的url经ffmpeg处理后推向国内vps
    ffmpeg -re -i https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1621117387/ei/a_WfYNbWKYuOhwbTqruIAQ/ip/108.61.148.107/id/5qap5aO4i9A.0/itag/96/source/yt_live_broadcast/requiressl/yes/ratebypass/yes/live/1/sgoap/gir%3Dyes%3Bitag%3D140/sgovp/gir%3Dyes%3Bitag%3D137/hls_chunk_host/r2---sn-ab5sznly.googlevideo.com/playlist_duration/30/manifest_duration/30/vprv/1/playlist_type/DVR/mh/30/mm/44/mn/sn-ab5sznly/ms/lva/mv/u/mvi/2/pl/23/dover/11/keepalive/yes/fexp/24001373,24007246/mt/1621095404/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,live,sgoap,sgovp,playlist_duration,manifest_duration,vprv,playlist_type/sig/AOq0QJ8wRQIgGWdi0_3QvVYyLJM0D8THf0mzxzpWSUITxjSfmo1VB8QCIQC99_iWx4iiQKL_8l4h_y_IOmOal8DbQKosezzsY-uZ5w%3D%3D/lsparams/hls_chunk_host,mh,mm,mn,ms,mv,mvi,pl/lsig/AG3C_xAwRQIgBHoxcUid7uKQzzYqINnjdfgAvugHvVw57AECfBHr1DECIQDas7PM9jMGff4fn3YnM3c8I5vuHGilQj_pRV7nT351AQ%3D%3D/playlist/index.m3u8 -vcodec copy -acodec copy -f flv -flvflags no_duration_filesize "rtmp://【国内vps的ip】/testmusic"
  • 4.1.3

  由于国内vps的rtmp已经在前面配置好了ffmpeg的处理和发送到bilibili,到此应该直播间就能收到信号了。下面再给出一个推流本地视频的指令。

  • 4.2推流本地视频
        ffmpeg -re  -stream_loop -1 -i Desktop/IMG_5376.mp4 -vcodec copy -acodec aac -f flv "rtmp://live-push.bilivideo.com/live-bvc/【你的直播码】"

  这里给出的是循环播放的代码。

    yum install screen #安装screen
    screen -S name #name用于命名screen窗口用途
    screen -ls     #查看进程
    screen -r.     #进入单一进程
    screen -r -d 1805 #进入screen进程
    screen -X -S 122128 quit #关闭某一进程
    ctrl-a +d #保持进程的同时退出当前窗口
  • 5.2转播YouTube以外的其他功能

  有待探索……

  • 6.感想

  这样写下来感觉真的蛮简单的,跟做的时候感觉完全不一样……也确实,逻辑上来讲我完全没有原创性的工作,只是东拼西凑完成了我想要的效果而已……但是其中的种种困难,也许只有试过的人才知道吧:首先我对Linux就不熟,很多文件操作的命令都得现学;其次,也许安装的过程中哪一步就不对了,原因有很多,版本太新、太旧、路径不正确等等,当时如果没有敏锐地在一行行安装指令中意识到问题的话,后面一堆error出现连Google都没有解决方案的时候,那是真的很崩溃。
  我对Linux也有全新的认识。在网上某计算机课上听来的“没有消息就是好消息,这就是Linux的哲学”,确实是如此。一行安装代码,一个回车,弹出来几十行上百行的代码,一个error也没有,这才是正确的结果;如果出了问题,就不要再往下了,应该仔细排查是哪里的问题,应该是不难解决的。无视它继续往下,问题只会越来越大。
  挺开心的。至少做出来了,虽然花的时间比想象中多多了。狠心买下国内服务器也没花冤枉钱,好事。

更新

2021.5.16

  为解决YouTube直播的URL每6小时左右改变导致断流的问题,新学了一点shell,现写了个脚本传上了GitHub。国外服务器一键启动推流功能,出现断流的情况时暴力循环所有步骤给续上。命令:
bash -c "$(curl -L https://raw.githubusercontent.com/suchacutesnake/continuousStreaming/master/lofigirl.sh)"
  项目地址:https://github.com/suchacutesnake/continuousStreaming
  首次使用vs code写代码,code runner插件牛逼!!!(破音)
  typecho上装上了编辑器插件EditorMD,现在排版舒服多了^_^

2020.5.20

  仍然存在断连问题,可能原因是因URL改变后暴力循环推流指令时服务器无法改变推流来源处的状态声明。参考:
https://github.com/arut/nginx-rtmp-module/issues/1152
https://github.com/dreamsxin/nginx-rtmp-wiki/blob/master/Directives.md
国内服务器配置文件部分修改:

# RTMP configuration
rtmp {
    server {
            listen 1935;
            chunk_size 128;

            application testmusic {
                live on;
                exec_publish ffmpeg -i rtmp://127.0.0.1:1935/testmusic -c copy -f flv rtmp://;
                drop_idle_publisher 10s;
            }
    }
}

  顺带说一个很坑的事:我有两台国外服务器,本来希望把推流的任务交给另一台以缓解带宽压力的,然后另一台用了宝塔论坛上的一键安装ffmpeg脚本,结果不知道他在脚本里写了些啥,后来怎么也升级不了ffmpeg到最新版了,导致整个计划搁浅了……

2020.5.21

  出于流量问题的考虑,更换了推流服务器。解决ffmpeg路径的问题是直接到ffmpeg所在的路径下运行新版的ffmpeg。centos的编译安装真的非常痛苦,少装点东西就又要全部重新编译一遍。如果给我重来一次的话我一定会选Debian。网上的教程也常常没有用……说到底还是只能怪我的Linux知识太缺乏(^_^;)

2020.5.25

这次坚持了三天才断流。修改了chunk_size 4096;,ffmpeg增加了参数-re以控制帧率,以及为所有的网址加上双引号。看看下次断流是什么个情况吧。

2020.5.30

更改了配置。

# RTMP configuration
rtmp {
    server {
            listen 1935;
            chunk_size 4096;
            drop_idle_publisher 5s;

            application testmusic {
                live on;
                exec_publish ffmpeg -i "rtmp://127.0.0.1:1935/testmusic" -c copy -f flv "rtmp://";
            }
    }
}

2021-10-08 09:48:51 星期五
其他链接:
debian11安装SRS教程
https://www.cnblogs.com/surplus/p/15319061.html

https://certbot.eff.org/lets-encrypt/debianbuster-nginx

https://www.imydl.com/linux/5744.html

最终成果:布置了hls直播服务,以下链接可在Safari直接打开(注意网址只能是http不能是https):

http://binaryenfold.xyz:8080/live/livestream.m3u8

2021-10-11 06:53:01 星期一
放一堆网址以后有空再整理:
nginx https反向代理设置
https://docs.nginx.com/nginx/admin-guide/security-controls/securing-http-traffic-upstream/
总体思路
https://ivampiresp.com/2020/04/05/%e4%bd%bf%e7%94%a8nginx%e7%9a%84rtmp%e6%a8%a1%e5%9d%97%e6%90%ad%e5%bb%ba%e4%b8%80%e4%b8%aa%e6%b5%81%e5%bc%8f%e5%aa%92%e4%bd%93%ef%bc%88%e7%9b%b4%e6%92%ad%ef%bc%89%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%b9%b6
https://www.jianshu.com/p/5539ccd8d9c4
反向代理
https://www.cnblogs.com/ysocean/p/9392908.html#_label3
http REFERER
http://www.ruanyifeng.com/blog/2019/06/http-referer.html
简单app
https://www.cnblogs.com/handongyu/p/6260209.html
express配置 https://blog.csdn.net/bwf_erg/article/details/70649536?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242
node.js https://nodejs.org/api/https.html#https_https_get_options_callback
socket.io
https://socket.io/docs/v4/server-initialization/#with-an-https-server
成果:
https://live.cutesnake.top:3000