如何B站24小时直播 ?从素材到推流 您所在的位置:网站首页 B站怎样看直播记录 如何B站24小时直播 ?从素材到推流

如何B站24小时直播 ?从素材到推流

2024-03-01 05:32| 来源: 网络整理| 查看: 265

如果您觉得复制命令不大方便,可以移步博客:https://www.goodnickname.ga/index.php/archives/39.html

这篇文章主要记录我最近使用服务器的一个总结。最近一周,我打起了拿服务器做直播的主意,本来在VPS上就动过心思,但苦于VPS在国外,不能往B站直播,只能搁置。近几周在本地偶然得到了一台Linux服务器,于是这个诞生很久的想法终于付出了实践的第一步。

由于这个人才疏学浅,bash shell也是现学现用,所以代码方面着实“浅显易懂”、怎么简单怎么来,请您阅读之前打好心理准备。(嘻)

列举出B站的一些24小时直播间:

B站音悦台、国际空间站俯瞰地球、实时云图

还有我搭建的每天定时开关直播间:明朝那些事儿 有声书

整个过程

简单记录下从制作素材,到直播的过程。我受一位心爱的up主的启发,想到要做映评馆,但出于手头存的影视剧不多,音频倒是有点。又看到B站播相声的较多,所以我就不播相声了,找了《明朝那些事儿》的音频,是刘纪同讲的,很早年前听过,拿这个做直播再好不过。有了想法,那就好办了,开工!

流程

我说了我这是把音频做成视频,然后推流,如果是看直接直播视频的,可以看“五、”这一部分,或者直接看这篇博客:https://www.goodnickname.ga/index.php/archives/36.html,或是

一、制作音频

我手头有音频,但是不全,所以就去搜了下,还真有,我在 http://tingmp33.meiwenfen.com/刘纪同_明朝那些事儿1/001.mp3 这个网站上找到了资源,它很好下载,这个页面就是音频所在的地方,而且它的地址很有规律,这就很方便下载,于是在Linux里,用了一个简单的脚本下载。首先,创建脚本nano down.sh:

#! /bin/bash

# 下载明朝那些事

for i in {1..9}

do

wget http://tingmp33.meiwenfen.com/%E5%88%98%E7%BA%AA%E5%90%8C_%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF5/00$i.mp3 

}&

done

for i in {10..39}

do

wget http://tingmp33.meiwenfen.com/%E5%88%98%E7%BA%AA%E5%90%8C_%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF$5/0$i.mp3

}& 

done

由于地址的结尾是001.mp3或者是011.mp3所以按照不同的末尾地址,做了不同的循环,然后用大括号{}扩上,这样能并发提升效率。这样每一部只需更改几个数字。

二、制作视频

我需要一个一个视频,可以是静态的图片,也可以是动态的。(为了操作简单,就制作了静态的图片)。

一共做了十几张图片,每张图片里22/33的衣服不一样。接下来,把这些图片组合成一个没有声音的视频,由于我是在Windows下PS的,所以这一步在Win下完成。

图片

图片—>视频

创建export_single_mp4.bat:(执行时请把这些\和换行都去掉)

for %%i in (*.jpg) do ( 

ffmpeg -ss 0 -t 106 -f lavfi -i color=c=0x000000:s=1920x1080:r=30  \

-i %%i -filter_complex  "[1:v]scale=1920:1080[v1];[0:v][v1]overlay=0:0[outv]"  \ 

-map [outv] -c:v libx264 out%%~ni.mp4 -y)

这里用到了bat中的for循环,do()里面的ffmpeg命令,其中-ss -t参数表示起止和持续的时间,也就是这张图片持续多长时间,这里以秒为单位,也可以写成00:01:30这种形式。关于我用的的ffmpeg命令,参见这篇文章的末尾吧(如果我记着写的话)执行这个,生成从out0.mp4到out13.mp4这些个视频然后把这些视频的名称输出到一个文本文件tmp.txt里,创建list_file.bat:

for %%i in (*.mp4) do (    

echo file '%%i'>>tmp.txt 

)

关于这里用到的bat命令,我也把它放到文尾叭。。。

然后再创建一个sew.bat把这些单个的视频连起来,顺便删掉之前的单个视频:

ffmpeg -f concat -i tmp.txt -c copy  all_in_one.mp4 

del /Q out*.mp4

得到的这个all_in_one.mp4就是我所要的视频了。

三、合并音视频

我们用ffmpeg来完成这项工作,(还是具体参数去文尾看)把之前得到的all_in_one.mp4和下载来的音频文件放到一个文件夹。在文件夹里创建hebing.bat:

for %%i in (*.mp3) do (

ffmpeg -i all_in_one.mp4 -i %%i -vcodec copy -acodec aac -shortest 1-%%~ni.mp4

)

把当前目录里所有的mp3文件与all_in_one.mp4合并成视频,这里视频编码直接拷贝,音频编码,我们用aac,然后这个-shortest表示我们输出的这个视频的时长取两个输入流中最短的,为了音频不受影响,这就要求我们的all_in_one.mp4的时长比所有音频都长,如果你不能保证这一点,去上一步再合成一遍all_in_one.mp4吧,把-ss -t那里的时间改长一点。注意这里输出视频的命名方式是1-001.mp4,这表示第一部的第一个视频,我后面的脚本写的很简单,所以要跟它保持一致。

四、视频加水印

直播的时候我想不仅显示一个图片,还在图片上显示当前播放的集数,这一点用OBS推流很容易做到,但是那样耗费的服务器资源就比较多了,违背了我做轻量级直播的初衷。其实在制作图片的时候加入文字最为简单,但是需要处理的图片实在是过于多了,所以我采取了曲线救国的方式:用ffmpeg给视频加上水印,水印的内容是视频的名字。把上一步做好的视频放到一个文件夹,并编写2.bat:

for  %%i in (*.mp4)  do ffmpeg  -hwaccel cuvid -i %%i  \

-vcodec h264_nvenc -acodec copy \

 -vf "drawtext=fontfile=STLITI.TTF: text='明朝那些事`儿.%%~ni' :x=550:y=28:fontsize=50:fontcolor=black:shadowy=1"  \ 

H:\明朝那些事\1\待加水印\out\%%~ni.mp4`

(东西太长,还是把\和换行都去掉)

这里用到了一堆东西,一个一个说。首先我加水印这一步,用的是Win10,不如Linux,在加水印的时候会遇到字体缺失这一问题,但同时Win10这里可以用到英伟达显卡的加上渲染。来说说:

1.字体缺失?你可以去你的C:\Windows\Fonts文件夹里,把你需要的字体,复制到你要加水印的文件所在的文件夹里,然后再来。

如果还是不行,尝试一下下面这个办法:(出处为一篇博客,但我实在是找不到原出处了,这里引用表示歉意)

去这个地方:https://www.freedesktop.org/software/fontconfig/release/下载fontconfig。选一个release,win10用就下.gz的。完成之后,解压,找到conf.d文件夹,和fonts.conf.in、fonts.dtd,在ffmpeg.exe所在的目录里新建fonts文件夹,把这仨复制进去,把fonts.conf.in改成fonts.conf。这回再来,就应该可以了

2.GPU渲染,使用GPU渲染会让你加水印时间缩短很多方法出自这里:https://blog.csdn.net/COCO56/article/details/89517157

简单来说,就是下载CUDA: https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exelocal,

安装。完成之后输入命令ffmpeg -hwaccels,看返回值,是否支持cuda。然后,执行ffmpeg时,加上-hwaccel cuvid指定使用cuvid硬件加速,并且-c:v h264_cuvid:使用h264_cuvid进行视频解码-c:v h264_nvenc:使用h264_nvenc进行视频编码更多的命令您可以去原博客看,我这里用到的就是这几个。

3.其他的命令

vf "drawtext=fontfile=STLITI.TTF: text='明朝那些事儿.%%~ni' :x=550:y=28:fontsize=50:fontcolor=black:shadowy=1"

这一串东西就是给你的视频加上水印了,具体是什么,可以去官方文档https://ffmpeg.org/ffmpeg-filters.html#drawtext-1里看看drawtext是怎么写的。fontfile后面就是你要用的字体名称,记得先放到文件夹里;text后面就是你要加上的文字了;后面水印位置、字体大小、颜色就不细说了,你需要一步一步的调,建议先裁剪出一个小视频慢慢的调整,需要花费不少功夫。。。

如果你遇到加上的文字是乱码,很可能是你的编码有了问题,你在创建bat前创建的txt默认使用的是UTF-8编码,而cmd里汉字用的是ANSI编码。这就意味着你需要编辑你的批处理文件,然后【另存为】,把下面的编码改成ANSI即可。

加完水印后五、推流脚本

把上一步制作出来的成品视频,拷贝到Linux服务器,然后编写个推流用的脚本,做个定时任务,就可以开启直播了。前面我记录过我是怎么自动开播,自动直播的。可以去看上一篇文章。

只不过当时用的推流脚本没有这次的复杂。

我先是放出脚本文件,然后再说一说:

正式用的脚本:

#! /bin/bash#Bilibili Auto Live Script#Date 2020.5.25#Version 1.1.0#log=/home/moonhikari/sh/log/bililive.log MAX_1=119MAX_2=37MAX_3=71MAX_4=79MAX_5=39MAX_6=38

section=$(cat $log | awk 'END {print}' | awk -F" " '{print $1F}') #取得章节episode=$(cat $log | awk 'END {print}' | awk -F" " '{print $2F}') #取得集数function push (){ffmpeg -re -i /home/moonhikari/Videos/Ming/$section/$section-$episode.mp4 \         -vcodec copy -preset veryfast -acodec copy -strict -2 -f flv \        "rtmp://txy.live-send.acg.tv/live-txy/?streamname=live_XXXXXXXXXX&key=XXXXXXXXXXXXXXXXXXXX"         tmp=$?        if [[ $tmp -ne 0 ]];then         return 1        fi         echo ${1} ${2} end time:$(date +'%F %T')>> $log         sleep 3  }function check (){                      #检查    if [[ $section -eq 1 ]];then            #分部讨论,确定最大集数    let max=$MAX_1    elif  [[ $section -eq 2 ]];then        let max=$MAX_2    elif [[ $section -eq 3 ]];then        let max=$MAX_3    elif [[ $section -eq 4 ]];then         let max=$MAX_4    elif [[ $section -eq 5 ]];then         let max=$MAX_5    elif [[ $section -eq 6 ]];then        let max=$MAX_6    else         let max=$MAX_1         let section=1fi

    if [[ $episode -ge 1 && $episode -lt $max ]];then        let episode+=1    elif [[ $episode -eq $max ]];then       #如果已经是最后一集         if [[ $section -eq 6 ]];then #判断是否为最后一部                let section=1           #若是则从第一部开始         else                 let section+=1          #不是则换至下一部         fi         episode=1                       #换至第1集    else         let episode=1    #没有数据,就从1开始fi}

while [[ 1 -eq 1 ]]docheckpush $section $episodeif [[ $? -eq 1 ]];thenbreakfidone

如果你看注释能看明白,那我就应该不需要说什么了,这就是一个简单的循环,里面用了if else做判断,然后用循环来逐集推流。关于bash shell的知识,可以看看B站上的视频BV1st411N7WS,说的比较系统吧。。。关于ffmpeg的命令,文尾会说。

六、如何自动开播,自动直播?

看上一篇文章:https://www.goodnickname.ga/index.php/archives/36.html

下面是附录:

附录一、FFmpeg

1.安装

Linux下软件仓库基本都有,Debian系:

sudo apt install ffmpeg

Arch系,我相信你肯定知道方法!Windows:去FFmpeg官网:https://ffmpeg.org/,点击Download,然后选择Windows,然后一步一步点吧,下载build。

如果是Windows,下载完你需要配置环境变量:右键【此电脑】—>【属性】—>左侧导航栏【高级系统设置】—>【环境变量】,找到下面【系统变量】的Path,编辑它,【新建】,把你ffmpeg.exe的路径放进去,比如是:D:\ffmpeg\bin\。如果你在cmd里输入ffmpeg有结果了,那至此安装完成。

2.基本命令

ffmpeg -i INPUT -vcodec libx264 -acodec aac OUTPUT

这是一个简单的操作,-i是输入流、OUTPUT是输出流,-vcodec和-acodec是视、音频编码格式,如果不想再次编码可以后面写copy。它们也可以写成c:v 、c:a,或者在一起-c copy。

3.加水印的命令这个上面说的够用了,如果你觉得说的不好,您可以百度下其他的文章,或是看FFmpeg官方文档:https://ffmpeg.org/ffmpeg-filters.html#drawtext-1。

4.拼接音视频合并,只需要用两个-i,一个视频、一个音频即可,这里编码要分开写。

几段视频合成 可以像上面说的,把视频们的名称放到文本文件里,每行上写:

file '1.mp4'

file '2.mp4'

然后参数写:-f concat -i tmp.txt或者,-i "concat:1.mp4|2.mp4"关于控制时长,怎样知道视频的时长?可以 ffprobe test.mp4,但是这个时间不打精准,最好是使用mediainfo。这个怎么用,不具体说了。。用-ss -to这是起止时间点,或是用-ss -t控制起始和持续的时间。注意,将-ss写到-i前头,这样能处理得更快一些,但为了使视频时长显示准确,在后面加上-copyts拷贝时间戳来保证这一点

5.推流(去掉\和换行)

ffmpeg -re -i ~/Videos/Ming/1/1-0$j.mp4\

-vcodec copy -preset veryfast -acodec copy -strict -2 -f flv \

OUTPUT

用-re推流,-preset 为预设,推流就用veryfast吧,-f flv是输出流的格式。

还有其他好多用法,这里只是简单的一提,如果你觉得看着不大有趣,可以去B站看视频:BV1Ft411s7Xa,还有就是翻阅官方文档

附录二、bash shell

bash得东西还是看视频吧:https://www.bilibili.com/video/BV1st411N7WS?p=1

说说bat

%%i是一个变量,我用来表示文件,%%~ni是去除了扩展名的。注意,这是在bat里,要是直接在cmd里,是要写成一个百分号的。

不多说了

(完)

参考与链接:

[1]: https://www.bilibili.com/video/BV1st411N7WS?p=1

[2]:http://tingmp33.meiwenfen.com/%E5%88%98%E7%BA%AA%E5%90%8C_%E6%98%8E%E6%9C%9D%E9%82%A3%E4%BA%9B%E4%BA%8B%E5%84%BF1/001.mp3

[3]: https://ffmpeg.org/ffmpeg-filters.html#drawtext-1

[4]: http://ffmpeg.org/

[5]: https://www.freedesktop.org/software/fontconfig/release/

[6]: https://blog.csdn.net/COCO56/article/details/89517157

[7]: https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exelocal

[8]: https://www.goodnickname.ga/index.php/archives/36.html

如果您觉得复制命令不大方便,可以移步博客:https://www.goodnickname.ga/index.php/archives/39.html



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有