Claws Garden

rtmp推流服务器

0 视频知识

参考一篇写得不错的文章。一文看懂:史上最通俗的视频编码技术详解 - 环信 (easemob.com)

重点在于理解视频编码格式(H.264 MPEG4 H.263 H.265即HEVC等)是压缩视频、编码视频的方法的方法,而视频格式(MPG MP4 MKV FLV等)是指视频容器,规定了视频和音频应该如何封装。视频编码格式和所使用的视频容器是正交的,同一种视频编码也可以使用多种容器存放,他们的关系就像菜和饭盒,烹饪菜的方法是编码格式,视频容器是饭盒。

视频流压缩存储下来的过程叫做编码,而视频容器中压缩存储的视频数据解析生成视频流的过程叫做解码。

1 搭建RTMP服务器

docker run -d --restart=always -p 1935:1935 --name nginx-rtmp tiangolo/nginx-rtmp

之后就可以使用rmtp://<host>/live/<channel>来推流和拉流了。channel是一个自定义的标签。

2 ffmpeg推流

ffmpeg -re -i input.mp4 -vcodec copy -acodec copy -f flv <rtmp url>

或者ffmpeg -re -i input.mp4 -c copy -f flv <rtmp url>

将视频推流到rtmp服务器。rtmp url的格式是rmtp://<host>/live/<channel>,channel是自定义的标签名。

其中对参数进行简单解释:

添加字幕

如果要添加字幕就不能用-c copy或者-vcodec copy -acodec copy了,因为会修改视频流。使用filter,例如:

1ffmpeg -re -i "$mp4.mp4" -vf "subtitles='$mp4.Chs&Jap.ass'" -f flv rtmp://xxx.xxx/live/test

添加文字水印

还是使用filter,下面展示了同时使用字幕和文字水印的情况,用逗号分隔filter

1ffmpeg -re -i "$mp4.mp4" -vf "subtitles='$mp4.Chs&Jap.ass'","drawtext=text='Claws TV Hyouka':x=10:y=10:fontsize=24:fontcolor=white:shadowy=2" -f flv rtmp://xxx.xxx/live/hyouka

循环播放

上面的命令在视频整条推流完成后就退出了,如果想要一直循环播放,可以使用下面的命令:

ffmpeg -re -stream_loop -1 -i input.mp4 -vcodec copy -acodec copy -f flv <rtmp url>

-stream_loop 参数指定要将输入的视频循环播放多少遍,-1则表示无限循环。

循环播放视频列表

如果想要循环播放多个视频,就有点麻烦了,下面的脚本展示了如何循环播放一个文件夹下的所有MP4视频,加上对应的字幕和水印。

 1#!/bin/sh
 2# 请在冰菓目录执行
 3while true
 4#for i in {1..3}
 5do
 6        for video in ./*
 7        do
 8                if echo "$video" | grep -q -E '\.mp4$'
 9                then
10                        #echo "$video" | cut -d '.' -f 1
11                        video_name=$(echo "$video" |  sed 's/\.\/\(.*\)\.mp4/\1/')
12                        if test -f "$video_name.mp4"
13                        then
14                                echo "$video_name playing..."
15                                ffmpeg -re -i "$video_name.mp4" -vf "subtitles='$video_name.Chs&Jap.ass'","drawtext=text='Claws TV Hyouka':x=10:y=10:fontsize=28:fontcolor=white:shadowy=2" -f flv rtmp://xxx.xxx/live/hyouka
16                        fi
17                        echo ""
18                fi
19        done
20done

3 VLC 拉流

这里使用VLC示例,其实很多播放器或浏览器都可以支持拉流,windows平台最好用的视频播放器potplayer也是其中之一。

iPhone的VLC可以直接在网络中找到“打开网络串流”,输入rtmp url即可观看直播内容。

image-20221214204038424

potplayer则也很容易,使用Ctrl + U快捷键,或者右键菜单,在“打开”中找到打开链接,输入rtmp url即可观看直播。

image-20221214204924807

4 拓展

ffmpeg使用起来可能比较复杂,对于新手来说不太友好。这里推荐一个直播推流的平台:https://streamyard.com

可以在上面非常方便地组织屏幕、加入视频等操作,推流到自己的rtmp服务器。但是暂时还没有办法实现一直后台轮播的效果,也许后续版本会出。

#RTMP #服务器