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即可观看直播内容。
potplayer则也很容易,使用Ctrl + U快捷键,或者右键菜单,在“打开”中找到打开链接,输入rtmp url即可观看直播。
4 拓展
ffmpeg使用起来可能比较复杂,对于新手来说不太友好。这里推荐一个直播推流的平台:https://streamyard.com
可以在上面非常方便地组织屏幕、加入视频等操作,推流到自己的rtmp服务器。但是暂时还没有办法实现一直后台轮播的效果,也许后续版本会出。