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是自定义的标签名。

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

  • -re 指定按照帧率速度推流,否则ffmpeg就会按照最快速度输出,没法看
  • -i 输入文件
  • -vcodec -acodec 指定了输出时的编码器。copy代表使用原来的编码器,这样速度会很快,不需要什么计算
  • -f flv 指定输出时采用flv容器标准格式,rtmp推流支持这种格式

添加字幕

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

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

添加文字水印

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

ffmpeg -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视频,加上对应的字幕和水印。

#!/bin/sh
# 请在冰菓目录执行
while true
#for i in {1..3}
do
        for video in ./*
        do
                if echo "$video" | grep -q -E '\.mp4$'
                then
                        #echo "$video" | cut -d '.' -f 1
                        video_name=$(echo "$video" |  sed 's/\.\/\(.*\)\.mp4/\1/')
                        if test -f "$video_name.mp4"
                        then
                                echo "$video_name playing..."
                                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
                        fi
                        echo ""
                fi
        done
done

3 VLC 拉流

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

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

image-20221214204038424

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

image-20221214204924807

4 拓展

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

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