如何检测 Red5 中的实时流分辨率?

How do I detect live stream resolution in Red5?

如何检测 Red5 中的实时流分辨率? 我确实覆盖了 streamPublishStart(IBroadcastStream stream) 流开始的地方(如果我错了请纠正我):

public void streamPublishStart(IBroadcastStream stream) {
        IConnection connection = Red5.getConnectionLocal();
    log.info("W3C x-category:stream x-event:publish c-ip:{} x-sname:{} x-name:{}",
            new Object[] { connection != null ? connection.getRemoteAddress() : "0.0.0.0", stream.getName(), stream.getPublishedName() });

}

我可以在哪里访问 stream 对象。 我如何检查它的分辨率? 我确实尝试过 stream.getMetaData().getHeader() 但它给了我 Header is null 错误。 我用谷歌搜索了问题,但找不到任何解决方案。

您需要对传入的数据进行解码以获取所需的信息。 Red5 不解码流 out-of-the-box。我们提取的唯一信息是 AVC 和 AAC 编码的 "config" 数据,我不会称其为 "decoding" per-se。该配置只会为您提供有关 AVC/h.264 或 AAC 媒体的最少量信息。在这两个class中可以看到配置信息:

https://github.com/Red5/red5-io/blob/master/src/main/java/org/red5/codec/AVCVideo.java

https://github.com/Red5/red5-io/blob/master/src/main/java/org/red5/codec/AACAudio.java

您发布的方法签名中显示的 "stream" 在大多数(如果不是所有)情况下都是 ClientBroadcastStream。您可以通过扩展此 class 或创建自己的侦听器来查看传入的音频和视频数据。

最后,如果广播公司或文件源提供了元数据内容,则 getMetaData() 方法只会 return 对您有价值的东西;此外,"Header" 将不包含比特率。

元数据class:https://github.com/Red5/red5-io/blob/master/src/main/java/org/red5/io/flv/meta/MetaData.java

Header class: https://github.com/Red5/red5-server-common/blob/master/src/main/java/org/red5/server/net/rtmp/message/Header.java

因为这不可能直接实现,所以我将使用 ffmpeg 下载 5s 部分,然后使用 ffprobe 检查它的比特率:

ffmpeg -t 5 -re -i "rtmp://192.168.1.102/ntcServer/glosno live=1 timeout=5" -y -c copy test.flv
ffprobe -pretty test.flv 2>&1 | egrep 'bitrate: '

谢谢蒙丹。