使用ffmpeg实现无人直播

环境搭建

  • 云服务器一台 或者24开机联网运行的本地电脑
  • ffmpeg
  • 推流地址 (B站、抖音、斗鱼…)
  • 准备好不涉及侵权的视频内容

ffmpeg安装

我这边以ubuntu的云服务器为例给大家介绍

执行以下指令进行安装:

1
2
sudo apt-get update
sudo apt-get install ffmpeg

推流地址的获取

这里以B站直播平台为例 首先登陆哔哩哔哩直播 进入直播中心:

image-20240421221920492

然后开通直播间 这里需要进行实名认证:

image-20240421222031398

image-20240421222114948

由于实名认证太过麻烦 扫码半天扫不上 于是决定转战微信视频号直播 然而同样也需要各种认证 最后头大的我 又回到了B站😂

后来我发现二维码迟迟扫不上的原因是 手机登录的账号和电脑端登录的账号不一致 也是很无语 也没有个提示 只能靠试🤦‍♀️

好不容易扫码成功 进入实名认证页面 居然app存在bug提示人脸SDK初始化失败 哎😔

最后我下载了一个抖音直播伴侣

需要有一千粉丝才能开 咳咳 这个条件我已经满足了😃

不过凭心而论 B站直播是门槛最低的 接下来还是以B站直播为例 我使用老版本的哔哩哔哩app通过了实名认证, 然后进入到直播中心 点击开播设置选项卡:

image-20240423123033651

往下拉能看到服务器地址和密钥:

image-20240423123137063

推流地址=服务器地址+串流密钥

将两者组合在一起就能得到一个推流地址 如下:

1
rtmp://live-push.bilivideo.com/live-bvc/?streamname=live_485691562_50807751&key=afxxxxx99e2552f502129ba17a5b0&schedule=rtmp&pflag=1

开始推流

  1. 单个视频循环播放

    执行以下指令开始循环播放视频:

    1
    ffmpeg -re -stream_loop -1 -i "xxx.mp4" -c copy -f flv "推流地址"
  2. 多个视频挨个播放

    如果我们有多个视频需要进行挨个播放 那么我们需要创建一个文本文件 如need_play.txt 然后将视频绝对路径写入该文本中, 如下:

    1
    2
    file '/root/xxx/视频1.mp4'
    file '/root/xxx/视频2.mp4'

    然后执行以下指令开始播放:

    1
    ffmpeg -f concat -safe 0 -i /root/need_play.txt -c copy -f flv "推流地址"
  3. 多个视频循环播放

    上面多个视频挨个播放指令 一旦文本中的视频播放完 推流就会终止, 如果我们想从头到尾无限循环播放 那么我们可以使用shell脚本 将指令放入while循环中 如下:

    1
    2
    3
    4
    5
    6
    #!/bin/bash
    while true
    do
      ffmpeg -f concat -safe 0 -i /root/need_play.txt -c copy -f flv "推流地址"
    done
    echo "所有视频播放完毕"

    然后运行该脚本:

    1
    ./xxx.sh

效果测试

此时 我们能看到已经可以接收到直播内容了

image-20240424133753485

点击进入直播间

将视频同时推到多个直播平台

如果我们想将视频同时推到多个直播平台, 可以使用以下指令:

1
ffmpeg  -re -stream_loop -1 -i input_video.mp4  -c copy -f flv "推流地址1" -c copy -f flv "推流地址2"

如果需要配置视频参数可以使用类似于下面的指令:

1
2
3
4
5
6
7
ffmpeg -re -stream_loop -1  -i input_video.mp4 \
-c:v libx264 -preset fast -b:v 2500k -maxrate 2500k -bufsize 5000k -pix_fmt yuv420p \
-c:a aac -b:a 128k -ar 44100 \
-f flv "推流地址1" \
-c:v libx264 -preset fast -b:v 2500k -maxrate 2500k -bufsize 5000k -pix_fmt yuv420p \
-c:a aac -b:a 128k -ar 44100 \
-f flv "推流地址2"

参数解释:

  • -c:v libx264 指定视频编码器为x264(H.264)。
  • -preset fast 设置编码预设,影响编码速度和质量。
  • -b:v 2500k 设置视频比特率为2500kbps。
  • -maxrate-bufsize 用于控制编码的比特率变化。
  • -pix_fmt yuv420p 设置像素格式,常用于兼容性。
  • -c:a aac 指定音频编码器。
  • -b:a 128k 设置音频比特率。
  • -ar 44100 设置音频采样率。
  • -f flv 指定输出格式为FLV,这是直播常用的格式。
  • 目标URL和推流密钥。

Python脚本

如果你想实现一个大而全的功能, 那么可以考虑使用python写一个脚本, 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import os
import subprocess
import time


def stream_to_multiple_platforms(video_path, stream_urls):
# 构建FFmpeg命令
ffmpeg_command = ['ffmpeg', '-re', '-i', video_path]

# 为每个流地址添加输出参数
for url in stream_urls:
ffmpeg_command.extend(['-c', 'copy', '-f', 'flv', url])

# 使用subprocess启动FFmpeg进程
ffmpeg_process = subprocess.Popen(ffmpeg_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# 等待进程结束
ffmpeg_process.wait()

def main():
# 指定要循环播放的视频文件或文件夹路径
video_path = "your_video_path_or_folder"

# 指定多个推流地址
stream_urls = [
"rtmp://example.com/live/stream1",
"rtmp://example.com/live/stream2"
# 在此添加更多的推流地址
]

if os.path.isfile(video_path):
# 如果路径指向单个文件,循环播放该视频
while True:
stream_to_multiple_platforms(video_path,stream_urls)
elif os.path.isdir(video_path):
# 如果路径指向文件夹,循环播放文件夹内的所有视频并推流到多个平台
while True:
for root, dirs, files in os.walk(video_path):
for file in files:
if file.endswith((".mp4", ".avi", ".mkv")):
video_file_path = os.path.join(root, file)
# 循环播放视频
play_video(video_file_path)
# 同时推流到多个平台
stream_to_multiple_platforms(video_file_path, stream_urls)
else:
print("Invalid video path or folder path.")

if __name__ == "__main__":
main()

上面代码实现了将文件夹中的视频挨个循环推流到多个直播平台 后期可根据需求增减推流地址

直播转播

如果你想将网络的上直播或者视频进行转播 比如将国外的直播转到国内B站播放, 那么FFmpeg也可以实现, 指令如下:

1
ffmpeg -re -stream_loop -1 -i 视频网络地址 -c copy -f flv "推流地址"

关于获取网络直播的m3u8地址

  1. 方法一 : 使用谷歌插件进行嗅探 比如猫抓

    image-20240423192631757

  2. 方法二 : 使用本地抓包工具 或者浏览器开发者工具拦截

  3. 方法三 : 使用命令行工具

    youtube直播为例 使用以下指令可以获取到该直播的m3u8地址:

    1
    yt-dlp -g https://www.youtube.com/live/ydYDqZQpim8?si=fFDeIHwOO5Xrf9qb

相关文章

使用Ant Media实现无人直播

使用kplayer实现无人直播

使用Docker安装kplayer实现无人直播

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

0%