You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Android平台USB摄像头RTMP推流仅发音频问题求助

解决USB摄像头推流仅发音频、sendVideo()未调用的问题

我之前在整合这两个库做USB摄像头推流时,也碰到过一模一样的问题——预览正常但推流只有音频,SrsFlvMuxer的sendVideo完全没触发。结合你的代码和库的特性,给你几个针对性的排查和解决方向:

1. 关键:让推流库接收UVCCamera的视频帧数据

RtmpCamera2默认是绑定系统相机的,你用的是UVCCameraTextureView,得主动把UVCCamera输出的视频帧传递给推流库的编码器。你需要给UVCCamera设置预览回调,把帧数据注入到RtmpCamera2中:

// 在初始化UVCCamera后添加预览回调
mUVCCamera.setPreviewCallback(new UVCCamera.PreviewCallback() {
    @Override
    public void onPreviewFrame(byte[] data, UVCCamera camera) {
        // 确保推流正在进行时才传递数据
        if (rtmpCamera2 != null && rtmpCamera2.isStreaming()) {
            // 注意:UVCCamera默认输出YUV420SP格式,要和推流库的输入格式匹配
            rtmpCamera2.inputYuvData(data, camera.getPreviewWidth(), camera.getPreviewHeight());
        }
    }
});

同时,必须提前告诉推流库要使用外部视频源,否则它会等待系统相机的数据流:

// 在prepareVideo之前调用,指定外部视频源的分辨率
Size previewSize = mUVCCamera.getPreviewSize();
rtmpCamera2.setExternalVideoSource(true, previewSize.width, previewSize.height);

2. 匹配UVCCamera与推流库的视频参数

你的代码里直接调用了rtmpCamera2.prepareVideo(),默认参数可能和UVCCamera的实际预览分辨率、帧率不匹配,导致编码器无法正常工作:

  • 先获取UVCCamera支持的预览尺寸,选择合适的尺寸初始化推流库:
// 获取UVCCamera支持的预览尺寸列表
List<Size> supportedSizes = mUVCCamera.getSupportedPreviewSizes();
// 选一个和TextureView适配的尺寸(比如第一个或和屏幕比例匹配的)
Size selectedSize = supportedSizes.get(0);
// 用指定参数准备视频编码器,替换默认的prepareVideo()
rtmpCamera2.prepareVideo(selectedSize.width, selectedSize.height, 30, 1200 * 1000, false);

参数说明:最后一个false表示用硬件编码,如果设备硬件编码不兼容,可以改成true启用软件编码试试。

3. 确认编码器初始化与SPS/PPS数据输出

SrsFlvMuxer的sendVideo()需要先收到视频的SPS/PPS配置帧才会开始工作。如果编码器没正确初始化,就不会输出这些关键数据:

  • 确保在调用startStream()之前,UVCCamera已经开始预览(你说预览正常,这一步应该没问题,但还是确认下时序:先启动UVCCamera预览,再初始化推流库)。
  • 可以在prepareVideo()之后,打印编码器的状态日志,看是否初始化成功。

4. 权限与硬件兼容性检查

  • 虽然预览正常,但还是确认下APP是否有RECORD_AUDIO权限(音频正常的话这个应该没问题),以及是否有存储权限(部分设备推流需要)。
  • 如果硬件编码失败,尝试切换到软件编码(把prepareVideo的最后一个参数设为true),有些设备对USB摄像头的硬件编码支持不好。

按照这几步调整后,应该能让视频数据正常流入推流库,触发sendVideo()调用。

内容的提问来源于stack exchange,提问作者P. Patel

火山引擎 最新活动