使用ffmpeg从文件生成MPEG-TS

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

以下ffmpeg命令行将从正在循环的视频文件中产生mpeg-ts多播,并将本地时间刻录到视频中。 一种用例是,如果您要测量实时ABR转码器和视频播放器中添加的分发和流实时延迟。

 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(安全可靠传输)作为传输协议而不是多播的示例进行了更新。