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




