sndtb 2025-07-31 20:49 采纳率: 0%
浏览 7

Kurento中WebRtcEndpoint如何把流媒体数据通过HttpPostEndpoint转发到Http服务器。

kurento7.1.0框架中,把WebRtcEndpoint的音视频流通过HttpPostEndpoint推送到http服务器接口,该如何实现,需要哪些配置。
核心代码:

信令服务器的核心代码如下:

```java

pipeline = kurento.createMediaPipeline();

webRtcCaller = new WebRtcEndpoint.Builder(pipeline).build();
webRtcCallee = new WebRtcEndpoint.Builder(pipeline).build();

httpPostEndpoint = new HttpPostEndpoint.Builder(pipeline)
            .with("url", "http://192.168.0.149:8088/api/stream")
            //.with("contentType", "video/webm")
            //.with("useEncodedMedia", true)
            .build();


webRtcCaller.connect(webRtcCallee);  //呼叫者信息传送给被呼叫者
webRtcCallee.connect(httpPostEndpoint);  **//被呼叫者的连接到HttpPostEndpoint,(想实现把被呼叫者的音视频发送http://192.168.0.149:8088/api/stream,但没有成功,请问这是为啥,)**

webRtcCallee.addMediaFlowInStateChangedListener(event -> {      //该回调函数会执行,表明webRtcCallee有数据流入
      System.out.println("CalleeWebRtcEp 媒体流入状态: " + event.getState());
      System.out.println("CalleeWebRtcEp 媒体类型: " + event.getMediaType());
    });

    webRtcCallee.addMediaFlowOutStateChangedListener(event->{   //该回调函数会执行,表明webRtcCallee有数据流出
      System.out.println("CalleeWebRtcEp 媒体流出状态: " + event.getState());
      System.out.println("CalleeWebRtcEp 媒体类型: " + event.getMediaType());
    });

    httpPostEndpoint.addMediaFlowInStateChangedListener(event -> {   //该回调函数不会执行,表明httpPostEndpoint没有数据流入
      System.out.println("HttpPostEndpoint 媒体流入状态: " + event.getState());
      System.out.println("HttpPostEndpoint媒体类型: " + event.getMediaType());
    });

    httpPostEndpoint.addMediaFlowOutStateChangedListener(event->{   //该回调函数不会执行,表明httpPostEndpoint没有数据流出
      System.out.println("HttpPostEndpoint 媒体流出状态: " + event.getState());
      System.out.println("HttpPostEndpoint媒体类型: " + event.getMediaType());
    });


接口核心代码如下:
@PostMapping(value = "/api/stream", consumes = "video/webm")
public ResponseEntity<String> handleStream(@RequestBody byte[] data) {
    System.out.println("接收到数据, 大小: " + data.length + " bytes");

    // 保存到文件
    try (FileOutputStream fos = new FileOutputStream("D:/tmp/received.webm", true)) {
        fos.write(data);
        return ResponseEntity.ok("数据接收成功");
    } catch (IOException e) {
        e.printStackTrace();
        return ResponseEntity.status(500).body("数据接收失败");
    }
}
该如何修改上面的代码,才能实现把被呼叫者的音视频发送http://192.168.0.149:8088/api/stream?kurento-media-server媒体服务器需要做修改吗?
  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-07-31 20:50
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    在 Kurento 7.1.0 中,WebRtcEndpointHttpPostEndpoint 的连接逻辑需要特别注意。你目前的代码中存在几个关键问题,导致 HttpPostEndpoint 没有接收到数据。下面我将详细分析原因,并提供解决方案和修改后的代码


    ✅ 核心问题分析

    1. HttpPostEndpoint 不支持直接从 WebRtcEndpoint 接收数据

    • HttpPostEndpoint 是一个输出端点(Output Endpoint),它只能接收来自其他端点的数据,不能直接从 WebRtcEndpoint 接收
    • 要让 HttpPostEndpoint 接收数据,必须通过一个媒体流转发机制,比如使用 MediaPipeline 中的 MediaElementFilter 来进行中间转发。

    2. 未正确设置 HttpPostEndpoint 的传输格式

    • 如果你没有明确指定 contentType,Kurento 可能无法正确识别或封装数据。
    • 默认情况下,HttpPostEndpoint 使用的是 video/webm,但如果你使用的编码格式不同(如 H.264),就需要调整。

    3. 缺少必要的配置参数

    • useEncodedMedia 参数控制是否以编码后的媒体数据发送,这在某些场景下是必须的。

    🛠️ 解决方案

    第一步:确保 HttpPostEndpoint 正确配置

    httpPostEndpoint = new HttpPostEndpoint.Builder(pipeline)
        .with("url", "http://192.168.0.149:8088/api/stream")
        .with("contentType", "video/webm")        // 必须指定内容类型
        .with("useEncodedMedia", true)           // 是否发送编码后的媒体数据
        .build();
    

    加粗说明:

    • contentType 必须与 HTTP 接口所接受的格式一致(如 video/webm)。
    • useEncodedMedia 建议设为 true,以便发送原始编码数据。

    第二步:确保 WebRtcEndpoint 正确连接到 HttpPostEndpoint

    你需要使用一个中间节点来转发数据。例如,可以使用 MediaElementFilter 进行中转。

    ✅ 示例:使用 MediaPipeline 连接结构

    pipeline = kurento.createMediaPipeline();
    
    webRtcCaller = new WebRtcEndpoint.Builder(pipeline).build();
    webRtcCallee = new WebRtcEndpoint.Builder(pipeline).build();
    
    // 创建 HttpPostEndpoint
    httpPostEndpoint = new HttpPostEndpoint.Builder(pipeline)
        .with("url", "http://192.168.0.149:8088/api/stream")
        .with("contentType", "video/webm")
        .with("useEncodedMedia", true)
        .build();
    
    // 呼叫者连接被呼叫者
    webRtcCaller.connect(webRtcCallee);
    
    // 被呼叫者的输出连接到 HttpPostEndpoint
    webRtcCallee.connect(httpPostEndpoint);
    

    加粗说明:

    • 确保 webRtcCallee.connect(httpPostEndpoint) 正确执行。
    • 确保 webRtcCallee 有输入流(即 webRtcCaller 已经发送了数据)。

    第三步:检查 HTTP 接口是否正常接收数据

    确保你的 HTTP 接口能够处理 POST 请求,并且支持 Content-Type: video/webm

    ✅ 示例:Spring Boot 接口代码(需支持二进制)

    @PostMapping(value = "/api/stream", consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    public ResponseEntity<String> handleStream(@RequestBody byte[] data) {
        System.out.println("接收到数据, 大小: " + data.length + " bytes");
    
        try (FileOutputStream fos = new FileOutputStream("D:/tmp/received.webm", true)) {
            fos.write(data);
            return ResponseEntity.ok("数据接收成功");
        } catch (IOException e) {
            e.printStackTrace();
            return ResponseEntity.status(500).body("数据接收失败");
        }
    }
    

    加粗说明:

    • 使用 MediaType.APPLICATION_OCTET_STREAM_VALUE 替代 video/webm,因为 Spring 在解析时可能不完全支持自定义 MIME 类型。
    • 如果你确实要使用 video/webm,请确认接口是否支持该类型。

    第四步:添加监听器,调试数据流动情况

    webRtcCallee.addMediaFlowOutStateChangedListener(event -> {
        System.out.println("CalleeWebRtcEp 媒体流出状态: " + event.getState());
        System.out.println("CalleeWebRtcEp 媒体类型: " + event.getMediaType());
    });
    
    httpPostEndpoint.addMediaFlowInStateChangedListener(event -> {
        System.out.println("HttpPostEndpoint 媒体流入状态: " + event.getState());
        System.out.println("HttpPostEndpoint 媒体类型: " + event.getMediaType());
    });
    

    加粗说明:

    • 如果 httpPostEndpointMediaFlowInStateFLOWING,则表示数据已经成功传递。

    📌 额外建议

    1. Kurento Media Server 配置

    • 确保 kurento-media-server 的配置文件(如 /etc/kurento/modules/kurento/HttpPostEndpoint.conf)中没有限制或错误设置。
    • 检查日志文件(如 /var/log/kurento-media-server.log)是否有异常信息。

    2. 网络权限和防火墙

    • 确保 192.168.0.149:8088 可以从 Kurento 服务器访问。
    • 检查防火墙规则,确保 8088 端口开放。

    ✅ 总结:关键步骤清单

    1. 配置 HttpPostEndpointcontentTypeuseEncodedMedia
    2. 确保 WebRtcEndpoint 正确连接到 HttpPostEndpoint
    3. HTTP 接口应支持 application/octet-streamvideo/webm
    4. 添加监听器查看数据流状态。
    5. 检查 Kurento Media Server 日志和网络配置。

    📄 最终修改后的 Java 代码示例

    pipeline = kurento.createMediaPipeline();
    
    webRtcCaller = new WebRtcEndpoint.Builder(pipeline).build();
    webRtcCallee = new WebRtcEndpoint.Builder(pipeline).build();
    
    httpPostEndpoint = new HttpPostEndpoint.Builder(pipeline)
        .with("url", "http://192.168.0.149:8088/api/stream")
        .with("contentType", "video/webm")
        .with("useEncodedMedia", true)
        .build();
    
    webRtcCaller.connect(webRtcCallee);
    webRtcCallee.connect(httpPostEndpoint);
    
    webRtcCallee.addMediaFlowOutStateChangedListener(event -> {
        System.out.println("CalleeWebRtcEp 媒体流出状态: " + event.getState());
        System.out.println("CalleeWebRtcEp 媒体类型: " + event.getMediaType());
    });
    
    httpPostEndpoint.addMediaFlowInStateChangedListener(event -> {
        System.out.println("HttpPostEndpoint 媒体流入状态: " + event.getState());
        System.out.println("HttpPostEndpoint 媒体类型: " + event.getMediaType());
    });
    

    如有更多关于 Kurento 的问题,欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 7月31日