1. 整体架构图
2. 拉取所需镜像
首先需要拉取两个Docker镜像:
docker pull ossrs/srs
docker pull hu849434163457/ffmpeg-python
3. 准备文件
(Python推流脚本)
import subprocess
# 定义 ffmpeg 命令
command = [
'ffmpeg',
'-re', # 以原生帧率读取输入
'-stream_loop', '-1', # 无限循环输入
'-i', 'link-preview-guide-RYBKVDCD.mp4', # 输入文件
'-c:v', 'libx264', # 视频编码器
'-preset', 'ultrafast', # 编码速度优先
'-tune', 'zerolatency', # 零延迟优化
'-b:v', '1000k', # 视频码率
'-maxrate', '1000k', # 最大码率
'-bufsize', '1000k', # 缓冲区大小
'-f', 'flv', # 输出格式为 FLV
'-loglevel', 'debug', # 日志级别
'-headers', 'Content-Type: video/x-flv', # HTTP 请求头
'rtmp://10.18.16.55:1935/live/aa' # 推流地址(RTMP)
]
# 启动 ffmpeg 子进程
try:
subprocess.run(command, check=True)
except subprocess.CalledProcessError as e:
print(f"ffmpeg 执行失败: {e}")
import subprocess
# 定义 ffmpeg 命令
command = [
'ffmpeg',
'-re', # 以原生帧率读取输入
'-stream_loop', '-1', # 无限循环输入
'-i', 'link-preview-guide-RYBKVDCD.mp4', # 输入文件
'-c:v', 'libx264', # 视频编码器
'-preset', 'ultrafast', # 编码速度优先
'-tune', 'zerolatency', # 零延迟优化
'-b:v', '1000k', # 视频码率
'-maxrate', '1000k', # 最大码率
'-bufsize', '1000k', # 缓冲区大小
'-f', 'flv', # 输出格式为 FLV
'-loglevel', 'debug', # 日志级别
'rtmp://10.18.16.55:1935/live/aa' # 推流地址(RTMP)
]
# 启动 ffmpeg 子进程
try:
subprocess.run(command, check=True)
except subprocess.CalledProcessError as e:
print(f"ffmpeg 执行失败: {e}")
需要准备一个测试视频文件
imput.mp4
4. Docker Compose配置
创建docker-compose.host-network.yml
文件:
version: '3.8'
services:
srs:
image: ossrs/srs:latest
container_name: srs_server
restart: always
ports:
# - "1935:1935/tcp" # RTMP
- "8080:8080/tcp" # HTTP-FLV/HLS
# volumes:
# - ./srs_conf:/usr/local/srs/conf
ffmpeg:
image: hu849434163457/ffmpeg-python:latest
container_name: ffmpeg_pusher
restart: unless-stopped
volumes:
- ./media:/media # 挂载媒体文件夹
command: >
bash -c "while true; do ffmpeg -re -stream_loop -1 -i /media/input.mp4 -c:v libx264 -preset veryfast -g 30 -b:v 1500k -c:a aac -b:a 128k -f flv rtmp://srs_server:1935/live/streamkey || sleep 5; done"
depends_on:
- srs
5. 播放流媒体
使用ffplay播放HTTP-FLV流:
ffplay http://10.18.16.55:8080/live/streamkey.flv