多流输出至 RTMP 时出错

多流输出至 RTMP 时出错

我打算创建多个流输出 - 1 个为 RTMP,另一个为 mp4 文件,如下所示:

/var/lib/snapd/snap/bin/ffmpeg -i rtmp://127.0.0.1:1935/live/$key -i /home/apache/logo.png -f image2 -loop 1 -i /home/apache/prod1.png -filter_complex “[0:v][1:v]overlay=x=30:y=10[vt];[vt][2:v]overlay=x='if(lte(-w+(t)*100,200),-w+(t)100+100,200)':y=10" -framerate 25 -r 30 -ar 44100 -c:a libfdk_aac -b:a 20000k -movflags +faststart -preset medium -crf 1 -tune zerolatency -maxrate 20000k -vcodec libx264 -fflags nobuffer -g 60 -max_muxing_queue_size 1024 -f flv pipe:1 | /var/lib/snapd/snap/bin/ffmpeg -i pipe:0 -vf drawtext="textfile=/home/apache/sampletext.txt: reload=1: fontcolor=white: fontsize=24: box=1:[电子邮件保护]: boxborderw=5: y=((h)-20):x=w-(mod(4n,w+tw)-tw/40)”-framerate 25 -r 30 -ar 44100 -c:a libfdk_aac -b:a 20000k -movflags +faststart -preset medium -crf 1 -tune zerolatency -maxrate 20000k -vcodec libx264 -fflags nobuffer -g 60 -max_muxing_queue_size 1024 -bsf:a aac_adtstoasc -map 0 -flvflags no_duration_filesize -f tee'[f=flv]'rtmp://127.0.0.1:1935/live/rp$key'|[f=mp4]/home/apache/test.mp4'

并在 rtmp 输出中看到以下错误:

输出 #0,flv,到‘pipe:1’: 元数据: 编码器:Lavf58.20.100 流 #0:0: 视频:h264 (libx264) ([7][0][0][0] / 0x0007),yuv420p,320x240,q=-1--1,30 fps,1k tbn,30 tbc(默认) 元数据: 编码器:Lavc58.35.100 libx264 附加数据:cpb:比特率最大/最小/平均:20000000/0/0 缓冲区大小:0 vbv_delay:-1 流 #0:1: 音频:aac (libfdk_aac) ([10][0][0][0] / 0x000A),44100 Hz,单声道,s16,20000 kb/s元数据:编码器:Lavc58.35.100 libfdk_aac [image2@0x5613e017e200] 线程消息队列阻塞;考虑提高 thread_queue_size 选项(当前值:8)输入 #0,flv,来自'pipe:0':元数据:编码器:Lavf58.20.100 持续时间:00:00:00.00,开始:0.000000,比特率:N/A 流 #0:0:视频:h264(高)、yuv420p(渐进式)、320x240、30 fps、30 tbr、1k tbn、60 tbc 流 #0:1:音频:aac(LC)、44100 Hz、单声道、fltp、20000 kb/s 流映射:流 #0:0 -> #0:0(h264(原生)-> h264(libx264))流 #0:1 -> #0:1(aac(原生)-> aac (libfdk_aac)) [Parsed_drawtext_0 @ 0x561287697200] 使用“/usr/share/fonts/dejavu/DejaVuSans.ttf” [libx264 @ 0x5612876a0000] 指定了 VBV maxrate,但没有指定 bufsize,忽略 [libx264 @ 0x5612876a0000] 使用 CPU 功能:MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2 [libx264 @ 0x5612876a0000] 配置文件高,级别 1.3 输出 #0,tee,到'[f=flv:onfail=ignore]rtmp://127.0.0.1:1935/live/rpdc78|[f=mp4]/home/apache/test.mp4':元数据:编码器:Lavf58.20.100 流 #0:0:视频:h264 (libx264),yuv420p,320x240,q=-1--1,30 fps,30 tbn,30 tbc 元数据:编码器:Lavc58.35.100 libx264 附加数据:cpb:比特率最大/最小/平均:20000000/0/0 缓冲区大小:0 vbv_delay:-1 流 #0:1:音频:aac (libfdk_aac),44100 Hz,单声道,s16,20000 kb/s 元数据:编码器:Lavc58.35.100 libfdk_aac 帧= 53 fps=0.0 q=0.0 大小= 249kB 时间=00:00:02.31 比特率= 877.9kbits/s 速度=4.39x ^M[flv @0x561287a1b500] 无法使用正确的持续时间更新标头。[flv @ 0x561287a1b500] 无法使用正确的文件大小更新标头。[tee @ 0x5612876677c0] 从属复用器 #0 失败:对等方重置连接,继续使用 1/2 个从属设备

我可以看到第二个输出被保存到正确的 mp4 文件,但是第一个输出失败了。

答案1

我认为您遇到的问题是由于您的直播输出造成的。我以前做过很多直播,这个问题对我来说是第一个绊脚石。

我认为您无法以 FLV 格式流式传输视频,因为该格式要求有关流的所有元数据都位于流(或文件)的末尾,而直到流式传输完成时您才会获得这些元数据。流式传输完成后,您可以获得该流的所有元数据,但那时您的流已经结束了。

对于非常短的直播,此问题将表现为客户端/浏览器长时间显示“加载”图标(直到您完成直播),此时它将开始显示直播。

但对于较长的直播流,您可能需要为输出流选择正确的格式。您可以尝试使用多路复用器/格式,该格式经常将元数据嵌入到数据包中(例如mpegts),或者您可以尝试分段输出,例如hls更多信息),它会发送媒体/流的多个块,每个块内包含所有元数据,因此客户端播放器/浏览器使用该流没有任何问题。rtp如果您的媒体服务器支持它,您甚至可以使用它。

查看更多直播示例这里

相关内容