在本文中,我将介绍如何通过循环MP4文件和Docker容器(可用于立即启动并运行)来使用ffmpeg生成MPEG-TS多播流。

以下ffmpeg命令行将从正在循环的视频文件中产生mpeg-ts多播,并将本地时间刻录到视频中。 一种用例是,如果您要测量实时ABR转码器和视频播放器中添加的分发和流实时延迟。
- 温特沃斯·斯塔吉奥内6 Episodio 8流媒体[SUB-ITA]
- 通过HTTP流调整Linux使其在10 Gbps网卡上达到最高性能。
- Smashcut 365:每天拍摄一部影片-第20周
- 本周在#Scala(2018年11月19日)
- 索尼高管表示,音乐产业正朝着“注意力经济”的方向发展
ffmpeg -stream_loop -1 -i /mnt/Sunrise.mp4 -map 0:v -vcodec复制-bsf:v h264_mp4toannexb -f h264-| ffmpeg -framerate 25 -fflags + genpts -r 25 -re -i--f lavfi -i anullsrc = r = 48000:cl = stereo -c:a aac -shortest -vf drawtext = fontfile = / root / Vera.ttf: fontsize = 12:text ='eyevinntechnology / toolbox-loopts':fontcolor=white@0.9:x = 20:y = 20:shadowcolor = black:shadowx = 2:shadowy = 1,drawtext = fontfile = / root / Vera.ttf :fontsize = 200:text ='%{localtime \:%T}':fontcolor=white@0.9:x =(w-tw)/ 2:y = 250:shadowcolor = black:shadowx = 2:shadowy = 1, drawtext = fontfile = / root / Vera.ttf:fontsize = 40:text ='[%{n} /%{pts}]'':fontcolor=white@0.9:x =(w-tw)/ 2:y = h -th-10:shadowcolor =黑色:shadowx = 2:shadowy = 1 -vcodec libx264-预设非常快-pix_fmt yuv420p -strict -2 -y -f mpegts -r 25 udp://239.0.0.1:1234?pkt_size = 1316
可以适当地揭开它的神秘面纱。
启动两个ffmpeg进程。 一个过程用于读取和解码输入文件,另一个过程用于生成mpeg-ts流。 第一个进程将输出比特流写入stdout,另一个进程从stdin读取比特流。
ffmpeg -stream_loop -1 -i /mnt/Sunrise.mp4 -map 0:v -vcodec复制-bsf:v h264_mp4toannexb -f h264-
上面的行从输入文件中“提取” h264 / AVC比特流,一旦到达文件末尾,它将搜索文件的开头并重复此操作,直到程序停止。 然后将输出写入标准输出。
ffmpeg -framerate 25 -fflags + genpts -r 25 -re -i-
第二步的这一部分从stdin读取输入,并假定视频的帧速率为每秒25帧,并生成新的PTS值。 要注意的一件事是,genpts标志仅在缺少该值时才生成PTS,这就是首先提取h264 / AVC比特流的原因。
-f lavfi -i anullsrc = r = 48000:cl =立体声-c:a aac-最短
上面添加了无声音频轨道,因为某些编码器要求在mpeg-ts流中存在音频pid。 下面的过滤器使用绘画文本过滤器将时间码和一些其他信息添加到视频中。
-vf“ drawtext = fontfile = / root / Vera.ttf:fontsize = 12:text ='eyevinntechnology / toolbox-loopts':fontcolor=white@0.9:x = 20:y = 20:shadowcolor = black:shadowx = 2: shadowy = 1,drawtext = fontfile = / root / Vera.ttf:fontsize = 200:text ='%{localtime \:%T}':fontcolor=white@0.9:x =(w-tw)/ 2:y = 250:shadowcolor =黑色:shadowx = 2:shadowy = 1,drawtext = fontfile = / root / Vera.ttf:fontsize = 40:text ='[%{n} /%{pts}]':: fontcolor=white@0.9 :x =(w-tw)/ 2:y = h-th-10:shadowcolor = black:shadowx = 2:shadowy = 1“
最后,以下内容指定了输出格式:
-vcodec libx264-非常快速地预设-pix_fmt yuv420p -strict -2 -y -f mpegts -r 25 udp://239.0.0.1:1234?pkt_size = 1316
为了简化所有步骤,我创建了一个可以使用的Docker容器。 它是一组容器的一部分,其中包含一些视频和流媒体工程师可能需要的便捷工具。 这是工具箱中的第一个工具,以后还会有更多工具。
假设您在Mac上运行Docker引擎并安装了VLC,那么您需要做的就是:
docker run --rm -p 9998:9998 / udp -v $ PWD:/ mnt eyevinntechnology / toolbox-loopts IN.mp4 udp://host.docker.internal:9998?pkt_size = 1316 --withtc
然后打开VLC以从
udp://@127.0.0.1:9998
如果要添加测试音,可以将其添加为选项
docker run --rm -p 9998:9998 / udp -v $ PWD:/ mnt eyevinntechnology / toolbox-loopts IN.mp4 udp://host.docker.internal:9998?pkt_size = 1316 --withtc --withaudio
有关选项的完整列表
泊坞窗运行--rm -p 9998:9998 / udp -v $ PWD:/ mnt eyevinntechnology / toolbox-loopts -h
安全可靠的运输
如果要使用SRT(安全可靠传输)而不是多播,则可以在SRT侦听器模式下运行循环。
docker run --rm -p 9998:9998 / udp -v $ PWD:/ mnt eyevinntechnology / toolbox-loopts IN.mp4“ srt://0.0.0.0:9998?pkt_size = 1316&mode = listener” --withtc
然后在VLC中使用以下地址
srt://@127.0.0.1:9998
请享用!
如果您对该博客还有其他疑问和评论,请在下面发表评论,或在Twitter(@JonasBirme)上发给我。
Eyevinn Technology 是一家领先的独立咨询公司,专门从事视频技术和媒体发行,并且是每年举行的北欧会议 瑞典Streaming Tech的 骄傲组织者 。
更新:使用SRT(安全可靠传输)作为传输协议而不是多播的示例进行了更新。