侧边栏壁纸
博主头像
AI研究僧

hycj89@163.com

  • 累计撰写 1,899 篇文章
  • 累计创建 179 个标签
  • 累计收到 1 条评论
标签搜索

目 录CONTENT

文章目录

centos7服务器上使用ffmpeg推送数据流至哔哩哔哩(bilibili)直播间24小时轮播

AI研究僧
2022-05-08 / 0 评论 / 0 点赞 / 689 阅读 / 1,080 字

基础环境

服务器:centos7.6
ffmpeg:5.0.1
python:3.8

b站直播间开通

https://www.bilibili.com/read/cv11803876 可以参考这篇文章开通B站直播间

centos7安装python3

https://www.he-yin.cn/archives/installpython3 参考该文安装即可

centos7安装ffmpeg

安装依赖

yum install autoconf automake bzip2 bzip2-devel cmake freetype-devel gcc gcc-c++ git libtool make pkgconfig zlib-devel yasm

下载ffmpeg

进入官网 https://johnvansickle.com/ffmpeg/
Snipaste_2022-05-08_10-38-15(1)
下载编译好的压缩包

安装ffmpeg

1、上传ffmpeg-release-amd64-static.tar.xz至服务器,假设放在/opt目录下
2、解压tar -xvJf /opt/ffmpeg-release-amd64-static.tar.xz
Snipaste_2022-05-08_10-41-06(1)
3、建立软连接ln -s /opt/ffmpeg-5.0.1-amd64-static/ffmpeg /usr/bin/ffmpeg
4、测试是否安装成功 ffmpeg -version
Snipaste_2022-05-08_10-51-50(1)

单视频推送测试

假设视频名称为01.mkv,将该视频上传至服务器/opt/video目录内
推送视频命令如下

ffmpeg -re -i /opt/video/01.mkv -vcodec copy -acodec aac -r 20 -b:v 500k -b:a 128k -f flv "服务器地址/串流密钥"

解释:
-re 以原生帧速率读取输入
-b:v 设置输出文件的视频比特率
-b:a 设置输出文件的音频比特率
-r 在输入文件后,强制设置输出fps,在输入文件前,强制设置原始文件fps
-vcodec copy 表示使用和原视频一样的视频编解码器
-acodec copy 表示使用和原视频一样的音频编解码器。aac是指定编解码器

以上两个需要查看视频获取信息,如果设置的不恰当,可能会导致音频有杂音,视频有卡顿
查看使用potplayer,方法如下:
Snipaste_2022-05-08_11-04-06(1)
Snipaste_2022-05-08_11-04-35(1)
Snipaste_2022-05-08_11-04-50(1)

服务器地址和串流密码
Snipaste_2022-05-08_10-59-45(1)
Snipaste_2022-05-08_11-00-21(1)
Snipaste_2022-05-08_11-00-52(1)
拼接即可,注意/默认带的有,示例中的/仅仅是为了区分
执行之后即可在直播间看到播放视频了

多视频推送

推送多个视频时,需要有文件保存视频路径,假设名称是playlist.txt,格式如下:

file '/opt/video/4/01.mkv'
file '/opt/video/4/02.mkv'
file '/opt/video/4/03.mkv'

命令如下:

ffmpeg -re -f concat -safe 0 -i /opt/playlist.txt -vcodec copy -acodec aac -r 20 -b:v 500k -b:a 126k -f flv "服务器地址/串流密钥"

-safe 0 是 ffmpeg 默认不允许 http-urls。这可以通过在 -i 参数之前在 ffmpeg 调用中包含 -safe 0 参数来绕过。
如果不加 safe,可能会报错
Unsafe file name '/opt/video/08.mkv' /opt/playbili/playlist.txt: Operation not permitted

但是播放一遍后就结束了。需要写代码循环播放。本人对shell略陌生,使用python实现,代码如下:

import os
import sys

path = sys.argv[1]  # 命令行传入视频路径
# print(path)
#path = "/opt/network"
with open('/opt/playlist.txt', 'w') as file:  # 构建 playlist.txt 文件
    for f in os.listdir(path):  #listdir返回文件中所有目录
        f_name = os.path.join(path, f)
        file.write("file " + "'%s'" % f_name + "\n")
while True:  # 循环播放
    os.system('ffmpeg -re -f concat -safe 0 -i /opt/playlist.txt -vcodec copy -acodec aac -r 20 -b:v 500k -b:a 126k -f flv "服务器地址/串流密码"')

保存文件名stream2bili.py,后台执行命令如下

nohup python3 stream2bili.py /opt/video/4/ >/dev/null 2>&1 &

首次执行时可以前台执行查看是否有报错

问题:一次播放完成后会有短暂卡顿,暂时先不处理

结束多视频运行

因为是后台运行,杀掉进程时略显麻烦,要先杀掉python进程使的while循环结束,然后再杀掉ffmpeg进程

ps -ef | grep stream2bili | grep -v grep | awk '{print $2}' | xargs kill -9
ps -ef | grep ffmpeg | grep -v grep | awk '{print $2}' | xargs kill -9

后记2022-5-17

问题1

视频播放过程中,iso端的app会出现黑屏,但是pc和安卓端都没有问题。后来发现可能是播放的一组视频内的分辨率不一致导致的,因为后续视频只要和第一个视频分辨率相同的均可播放,不同的就都是黑屏 。最后将不一致分辨率调整为一致后,顺利播放

博主关闭了所有页面的评论