使用ffmpeg将rtsp协议的视频流转换为flv视频流通过netty websocket服务推送给前端页面,前端通过flvjs播放。
- 存在问题,第一个订阅的前端可以正常播放,后加入的前端订阅者无法播放。
请问有没有朋友遇到过这个问题,我大概猜测有两个可能:
- ffmpeg 转码后的第一段流是不是有特殊标识供播放器识别,所以后加入的订阅没有这个段流
- netty的websocket通过bytebuf推送流的时候是否是有什么我没有注意到的问题
推送的代码
ChannelGroup channels = new DefaultChannelGroup(ImmediateEventExecutor.INSTANCE); try { ByteBuf buf = Unpooled.buffer(bufferSize); while (!Thread.currentThread().isInterrupted() && buf.writeBytes(stream, bufferSize) > 0) { channels.writeAndFlush(buf); buf = Unpooled.buffer(bufferSize); } } catch (IOException ignored) { }
Netty的二进制消息Encoder
public class BinaryWebSocketFrameEncoder extends MessageToMessageEncoder<ByteBuf> { @Override protected void encode(ChannelHandlerContext context, ByteBuf message, List<Object> out) throws Exception { BinaryWebSocketFrame frame = new BinaryWebSocketFrame(message.retain()); out.add(frame); } }