如果你想推流多个视频,你可以使用 -i 参数多次指定视频文件的路径。例如,你可以使用 ffmpeg -re -i video1.mp4 -i video2.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/rtmplive/home 来推流 video1.mp4 和 video2.mp4 这两个视频。
你也可以使用 -f concat 参数来将多个视频文件合并成一个输入源,然后使用 -i 参数指定合并后的视频文件。这样,你就可以使用单个命令推流多个视频。例如:
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
ffmpeg -re -i output.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/rtmplive/home
其中,list.txt 是一个文本文件,其中包含了要合并的视频文件的列表。每一行的格式为 file '/path/to/video.mp4'。例如:
file '/path/to/video1.mp4'
file '/path/to/video2.mp4'
file '/path/to/video3.mp4'
这样,你就可以使用两条命令推流多个视频了。
分两种情况来作答
第一种:不使用CDN的情况下,25个用户
在不使用CDN时,所有用户的连接视频源站访问,此时假设源站有200M带宽,上行速率200 / 8 = 25M/s(服务器吃的是上行带宽),25 / 1 = 25 个人,就是最大支持25个人同时使用1M/s的速度访问网站。 计算方式有些过于粗糙,具体的承受能力还要看视频长度和大小,视频传输方式,是否压缩等因素而定。
第二种:在使用CDN的情况下,250个用户
在使用CDN时,用户请求的就是CDN边缘节点,压力就在CDN节点上了,对于源站的压力就很小了。 CDN在抓取源站数据后会缓存到自己边缘节点上,用户的访问就不会到源站服务器上了。 假设CDN边缘节点有200M带宽,同时有10个边缘节点,承受能力就是200 * 10 / 8 / 1 = 250 人,而源站此时可能只需要10 - 20 M的带宽就足够了。目前市面上几大CDN厂商都拥有上千个节点,而且带宽也有千兆级别的。那承载能力就可想而知了,就看你能出多少钱了。
最近需要做实时录屏并把视频推流到RTSP服务器,具体流程是抓取屏幕内容(bitmap),并把bitmap转化为YUV,接着把YUV编码成H264,再把H264码流推到RTSP服务器;把采集到的PCM编码为AAC,再把AAC推流至RTSP服务器。
看了雷神的一篇文章: 最简单的基于FFmpeg的推流器(以推送RTMP为例) ,他是把本地的视频文件推流至RTMP服务器,并不符合我的要求。
接着我找到另一篇文章: ffmpeg实现H264压缩并且推流至RTSP ,这篇文章只有图像编码,并没有音频编码,并且推流之后并没有播放成功。
我综合上面两位大佬的思路,和查找一些资料实现了这个功能。
RTSP服务器使用的是 HappyTime 的免费试用版本。
我抓到的bitmap是BGRA格式的,所以使用的图像格式是 AV_PIX_FMT_BGRA , cropImage 是含有rgba图像的数组
调用:
由于我是实时抓取的屏幕, frame_yuv->pts 设为当前的时间戳,以保证能正常播放。
调用:
调用:
其中pcm_buff是包含pcm数据的数组
使用udp传输时传到1400多帧就断开链接了,原因不明,所以改用使用tcp协议传输
延迟有1.5秒左右
参考:
https://blog.csdn.net/leixiaohua1020/article/details/39803457
https://blog.csdn.net/yunge812/article/details/79345584
https://trac.ffmpeg.org/wiki
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)