代码改动
先解释一下udp推流,就可以把它想象成一开始学习网络编程udp和tcp通信,这不过这次传输的数据是音视频信息而已,它不像rtmp有流媒体服务器,拉流推流端,只有发送端和接收端。
URL = "rtmp://192.168.100.75/live/livestream"; avformat_alloc_output_context2(&octx, 0, "flv", URL); 改为 URL = "udp://192.168.100.75:6016"; avformat_alloc_output_context2(&octx, 0, "mpegts", URL);
即可,其他相同。
性能和延时
先说下配置,编码器配置为
av_opt_set(pCodecCtx->priv_data, "preset", "ultrafast", 0);//superfast av_opt_set(pCodecCtx->priv_data, "tune", "zerolatency", 0);
计算机为15年的老机,现在性能很拉跨,四核Intel® Core™ i5-4460 CPU @ 3.20GHz处理器。
用命令推流
ffmpeg -f decklink -i 88:25a7cda0:00000000 -pix_fmt yuv420p -ar 44100 -acodec libfdk_aac -vcodec h264 -preset ultrafast -tune zerolatency -b 5000k -r 25 -f mpegts udp://192.168.100.75:6016
top命令后id为56,并能稳定25帧推流,这里视频是1080i50。
用代码推流,id为55
在同一个局域网,过交换机,无论是用代码还是命令推流延时都非常小,不过还是能肉眼分辨出的,目测在300ms。
注意:
此外这里常见ffplay错误,可参考:ffmpeg udp推流bind failed: Address already in use
注意:ffplay命令为
ffplay -fflags nobuffer -analyzeduration 1000000 -i udp://127.0.0.1:6016
补充:用vlc播udp流时要加@,并且如果是127则需要换成具体的ip,如:
udp://@192.168.100.76:6017
这里 -fflags nobuffer非常关键,见:ffmpeg命令
搭建srs+rtmp的流媒体服务器,另一篇博客:srs搭建rtmp流媒体服务器
编译带h264编码和aac编码的ffmpeg库,另一篇文章:libfdk-aac和x264安装编译
用udp推流延时测试,见:rtmp改udp推流,并测试延时性能
srt流媒体搭建:srt流媒体搭建
ffmpeg编译配置srt模块:ffmpeg编译配置srt模块
srs+rtmp和nginx+rtmp推流延时比较
各部分所占延时:从采集到拉流各部分延时概述