近期单位用户提出需求,需要在单位内部的9台安卓智能电视(小米电视)上同步播放用户提供的宣传视频,希望能够做到所有电视音视频同步播放(电视均位于食堂内部,使用内置扬声器,各电视间音频延迟不同会导致混响) 。
由于电视在安装时只预留了电源线,使用HDMI分线器需要重新布明线;同时由于无线广播同屏系统采购价格较贵,最终经过研究决定利用公司已有的WLAN基础设施,在公司内部无线局域网上搭建流媒体服务器,在智能电视上装流媒体播放器,实现实时收看服务器上的视频。
经过测试,使用RTSP+UDP协议,播放1080P 25帧每秒的视频,各台电视能够实现音视频同步,效果可以媲美HDMI分线器,下面分享下该方案的实现过程。
按照本文的思路,可以实现企业内部电视台、宣传视频通过无线网实时广播到多个电视上播放的场景,当然具体应用效果还依赖于企业实际网络环境及多媒体设备配置情况。
一、调试网络通道
使用一台式电脑充当流媒体服务器,采用有线方式接入局域网,IP地址注意采用静态分配,不要用DHCP;电视采用无线接入,IP可以动态,但是需要能够ping通流媒体服务器,中间不经过NAT。
二、配置EasyDarwin
经过测试,使用RTMP推流时各台电视间音视频延迟差异较大,这是由于RTMP协议采用TCP传输,对网络环境较为敏感;采用RTSP(UDP)推流时效果最好。
流媒体服务器的可选项有很多,除了EasyDarwin外,还有Live555、Nginx(加RTMP插件)、SRS、OBS、VLC、rtsp-simple-server等,其中OBS、VLC都集成了推流组件和服务器,可以不用ffmpeg,单独使用,但是经测试,OBS对RTSP插件支持不是很好;VLC串流在视频循环播放方面存在一些问题,最终选择国产开源的EasyDarwin。
注:也可以采用rtsp-simple-server,rtsp-simple-server没有Web管理,占用系统资源少,网络安全风险小。
1.下载EasyDarwin,根据系统(Win或Linux)选择对应release包
Releases · EasyDarwin/EasyDarwin (github.com)
2.下载完成后解压
(1)EasyDarwin中,RTSP采用默认端口554,可在easydarwin.ini中修改,这里改为8554。
(2)运行EasyDarwin.exe即可启动服务
三、配置ffmpeg
FFmpeg是一个跨平台的自由软件,可以用于处理音视频文件。它提供了一组用于处理音视频数据的库和工具,可以对音视频进行解码、编码、转换、截取、合并等操作,支持多种音视频格式。FFmpeg被广泛应用于多媒体相关的应用程序和系统中,包括流媒体服务器、视频编辑软件、播放器等.
搞过音视频开发的同学应该都比较熟悉ffmpeg,相关用法这里不再赘述,这篇文章中主要是使用ffmpeg向EasyDarwin推流,再由EasyDarwin进行调度,将RTSP流分发给电视端播放器。
1.下载ffmpeg,官网选择对应系统版本下载
Download FFmpeg
2.将下载得到的压缩包解压至D:/,将解压出的文件夹重命名为ffmpeg。
3.为了能够在shell中直接调用ffmpeg命令,将“D:\ffmpeg\bin”添加至用户和系统的Path环境变量中。
4.测试推流
(1)测试前先启动EasyDarwin,参考上一部分
(2)将需要推流的视频文件(video.mp4)放入D:\share\中
(3)打开shell,输入:
ffmpeg -re -stream_loop -1 -i "D:\share\video.mp4" -c copy -f rtsp rtsp://127.0.0.1:8554/live
其中,
-re
: 以实时模式读取输入文件,即输入流以正常速度读取。-stream_loop -1
: 循环播放输入文件,直到手动停止。-i "D:\share\video.mp4"
: 指定要推送的视频文件的路径。-c copy
: 不进行任何编码或解码操作,直接将原始数据复制到输出流中。如果视频码率较大,需要进行分辨率、帧率压缩等操作。-f rtsp
: 指定输出流的格式为RTSP,默认使用UDP传输数据流,TCP传输控制流。rtsp://127.0.0.1:8554/live
: 指定输出流的URL,由于流媒体服务器和ffmpeg在一台终端上,此处可以使用127.0.0.1;如果是分开的,这里的IP需要改为运行EasyDarwin的机器的IP
命令执行后,最下方出现跳动的帧率和时间,证明已成功推出流给EasyDarwin。此时在EasyDarwin界面中能够看到session start,可访问EasyDarwin的Web界面 http://127.0.0.1:10008/查看详细信息。
四、智能电视安装VLC进行拉流
经过测试,在安卓智能电视(小米电视)中,OPlayer和VLC(使用v3.5.4 Beta版本,其余版本测试安装不成功)都可以实现稳定的RTSP拉流播放,但是需注意以下问题:
- 如果你只需要实现单个视频循环播放,oplayer就够用。
- 如果你需要实现多个视频周而复始地循环播放(列表循环),可以使用下一部分中的脚本,此时需要配合使用VLC播放器,并在VLC中设置循环模式为单个视频循环(点击视频右下角三个点,将“循环模式”点亮),该设置可记忆,设置一次即可(OPlayer中虽然也能设置循环,但是退出播放后无法记忆循环模式,每次都需要操作,较为麻烦)
注:VLC在安卓智能电视上默认为TV版UI,流媒体播放模块隐藏较深,不利于快捷操作,可使用以下方法改进
(1)使用无线键鼠,将接收模块插入智能电视USB口
(2)VLC中:设置>界面>去掉勾选“Android TV 界面”,此时需要使用鼠标拖动滑块才能更改设置
(1)如果你使用的是VLC,在VLC中:更多>新建串流 输入上一部分中配置的RTSP地址,此时需要将上步中的127.0.0.1替换为流媒体服务器在网络中的IP。如,流媒体服务器IP为172.16.0.2,端口为8554,路径为/live
rtsp://172.16.0.2:8554/live
(2)如果你使用的是OPlayer,操作类似,不再赘述
五、推流命令优化
我们在第四步中测试推流时使用的命令没有进行音视频编码操作,当推流源文件分辨率/帧率/码率较大时,可能会因网络及设备性能原因造成卡顿,甚至完全不能播放。
下面给出一个在生产环境中测试通过的推流命令,该命令限制了最大分辨率为1920×1080、帧率为25fps、平均码率为1500K,编码质量预设使用faster,以避免播放高清视频时出现卡顿。
ffmpeg -re -stream_loop -1 -i "D:\share\video.mp4" -vf "scale=w=min(1920\,iw):h=min(1080\,ih):force_original_aspect_ratio=decrease,fps=25" -c:v libx264 -preset faster -tune zerolatency -vb 1500K -f rtsp rtsp://127.0.0.1:8554/tv
其中,增加了以下参数来对原先的推流命令进行优化
-
-vf
参数:应用视频过滤器 -
-c:v libx264
参数:指定视频编码器为 libx264。 -
-preset faster
参数:设置编码速度和压缩比例之间的平衡。-preset有多个可选项,可根据具体环境进行调节,这里使用faster。 -
-tune zerolatency
参数:设置编码器的参数以降低延迟。 -
-vb 1500K
参数:设置视频比特率为 1500Kbps。
注1:
-vf
参数中指定了以下选项scale=w=min(1920\,iw):h=min(1080\,ih):force_original_aspect_ratio=decrease,fps=25其中:
scale
:将输入视频缩放到指定的大小。w
和h
表示输出视频的宽度和高度,min
函数用于选择最小值,以确保输出视频的宽高比与输入视频保持一致。force_original_aspect_ratio
:指定缩放后的视频宽高比与输入视频相同。decrease
:指示在缩放时可以缩小视频的大小,但不能增加大小。fps
:指定输出视频的帧率为 25fps。
注2:
-preset
参数的可选项有:
- ultrafast - 最快的预设,牺牲视频质量以实现更快的编码速度。
- superfast - 更快的预设,适用于需要更快编码速度但可以接受轻微质量损失的情况。
- veryfast - 较快的预设,适用于需要更快编码速度但需要保持较高视频质量的情况。
- faster - 快速的预设,适用于需要更快编码速度但需要保持高质量的情况。
- fast - 适度快速的预设,适用于需要保持良好视频质量但需要更快编码速度的情况。
- medium - 默认预设,用于平衡编码速度和视频质量。
- slow - 较慢的预设,用于需要更高视频质量但可以接受更慢编码速度的情况。
- slower - 更慢的预设,用于需要更高视频质量但需要更慢编码速度的情况。
- veryslow - 最慢的预设,用于需要最高视频质量但可以接受最慢编码速度的情况
六、附录:列表循环脚本、桌面直播推流脚本
在某些应用场景中,需要循环播放多个宣传视频,或者推流本地电脑桌面,使用麦克风直播等,此时编写powershell脚本操作ffmpeg即可,下面给出脚本:
1.循环播放多个视频(列表循环)
# 设置视频文件夹路径
$folderPath = "D:\share\"
# 查找支持的视频文件格式
$supportedExtensions = ".mp4",".m4a",".3gp",".flv",".mov"
# 获取所有支持的视频文件
$videoFiles = Get-ChildItem -Path $folderPath -File | Where-Object {$_.Extension -in $supportedExtensions}
# 显示即将推流的文件列表
echo $videoFiles
# 获取视频文件数量
$videoCount = $videoFiles.Count
# 判断视频文件数量
if ($videoCount -eq 1) {
# 只有一个视频文件
ffmpeg -re -stream_loop -1 -i $($videoFiles.FullName) -vf "scale=w=min(1920\,iw):h=min(1080\,ih):force_original_aspect_ratio=decrease,fps=25" -c:v libx264 -preset faster -tune zerolatency -vb 1500K -f rtsp rtsp://127.0.0.1:8554/live
} elseif ($videoCount -ge 2) {
# 有多个视频文件
$currentIndex = 0
do {
$currentVideo = $videoFiles[$currentIndex]
$nextIndex = ($currentIndex + 1) % $videoCount
$nextVideo = $videoFiles[$nextIndex]
ffmpeg -re -i $($currentVideo.FullName) -vf "scale=w=min(1920\,iw):h=min(1080\,ih):force_original_aspect_ratio=decrease,fps=25" -c:v libx264 -preset faster -tune zerolatency -vb 1500K -f rtsp rtsp://127.0.0.1:8554/live
# 计算下一个视频的索引
$currentIndex = $nextIndex
} while ($true)
}
将以上脚本存为.ps1文件,右键选择“使用PowerShell运行”即可实现目标文件夹中所有视频文件循环推流播放,注意,此时要使用VLC进行拉流并设置循环模式(见上一步),同时执行脚本前需要先运行EasyDarwin。需要更新视频源文件时,将视频文件放入D:\share\目录中,将该脚本关闭后重新运行即可。
2.推流电脑桌面,音频使用电脑麦克风输入,适用于直播课等场景。
ffmpeg -f gdigrab -framerate 30 -i desktop -f dshow -i audio="麦克风 (Realtek High Definition Audio)" -vcodec libx264 -preset ultrafast -tune zerolatency -acodec aac -f rtsp rtsp://127.0.0.1:8554/live
其中,audio="麦克风 (Realtek High Definition Audio)"需替换为你电脑的音频输入设备名称。如果不知道名称,可以使用
ffmpeg -list_devices true -f dshow -i dummy
来列出所有可用的音频输入设备。文章来源:https://www.toymoban.com/news/detail-494737.html
文章来源地址https://www.toymoban.com/news/detail-494737.html
到了这里,关于使用EasyDarwin + ffmpeg 搭建流媒体服务器,实现多台智能电视同步播放宣传视频的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!