在android webrtc中切换相机(后/前)

Posted

技术标签:

【中文标题】在android webrtc中切换相机(后/前)【英文标题】:switch camera(back/front) in android webrtc 【发布时间】:2017-09-12 22:50:08 【问题描述】:

我已经为 webrtc android 应用程序使用了 libjingle 库。我已经成功实现了双向通信的音频视频流。

到目前为止,我一直在使用前置摄像头进行视频流传输,但现在我想为用户提供选择前置或后置摄像头进行视频流传输的选项

如何存档?我对此一无所知。

我尝试过 VideocaptureAndroid 切换摄像头的方法,但不起作用。

如果有人知道然后帮我解决这个功能?

提前致谢。

【问题讨论】:

【参考方案1】:

您需要使用相同的 videoCapturer 对象,该对象是在初始 MediaStream 创建时创建的。

CameraVideoCapturer cameraVideoCapturer = (CameraVideoCapturer) videoCapturer;
cameraVideoCapturer.switchCamera(null);

AppRTC Reference

【讨论】:

感谢您的回答。现在这个类在新的 webrtc libjingle 库中完全改变了。所以这个解决方案不起作用。 它对我有用,它应该适用于最新的代码库。尝试构建 AppRTC 演示应用并检查切换摄像头。要么你的叮当声图书馆太旧,要么你做错了什么。试试我的框架github.com/AjayChoudary/WebRTCFramework 在原生 WebRtc for android 上试过了,效果不错! 它正在通过摄像头循环,在三星 a30 上进行了测试,它在正面切换了 2 次​​span> 【参考方案2】:

使用这个版本:org.webrtc:google-webrtc:1.0.22672

通过此方法创建VideoCapturer:

VideoCapturer videoCaptor = createCameraCaptor(new Camera1Enumerator(false));

诀窍在于 isBackFacing(...)/isFrontFacing(...)

private VideoCapturer createCameraCaptor(CameraEnumerator enumerator) 
    final String[] deviceNames = enumerator.getDeviceNames();

    // First, try to find back facing camera
    Logging.d(TAG, "Looking for back facing cameras.");
    for (String deviceName : deviceNames) 
        if (enumerator.isBackFacing(deviceName)) 
            Logging.d(TAG, "Creating back facing camera captor.");
            VideoCapturer videoCapturer = enumerator.createCapturer(deviceName, null);

            if (videoCapturer != null) 
                return videoCapturer;
            
        
    

    // back facing camera not found, try something else
    Logging.d(TAG, "Looking for other cameras.");
    for (String deviceName : deviceNames) 
        if (!enumerator.isBackFacing(deviceName)) 
            Logging.d(TAG, "Creating other camera captor.");
            VideoCapturer videoCapturer = enumerator.createCapturer(deviceName, null);

            if (videoCapturer != null) 
                return videoCapturer;
            
        
    

    return null;

【讨论】:

【参考方案3】:

这是一个使用 libjingle 的示例。 如果要在前后摄像头之间切换,则需要获取要使用的设备的名称。这可以使用VideoCapturerAndroid.getNameOfFrontFacingDevice()VideoCapturerAndroid.getNameOfRearFacingDevice() 来完成,具体取决于您要使用前置摄像头还是后置摄像头。

这是一个简单的例子,说明如何使用 io.pristine.libjingle:9127 获取正确的 VideoCapturer

private VideoCapturer getCameraCapturer(boolean useFrontCamera) 
    String deviceName = useFrontCamera ? VideoCapturerAndroid.getNameOfFrontFacingDevice() : VideoCapturerAndroid.getNameOfBackFacingDevice();
    return VideoCapturerAndroid.create(deviceName);

如果您使用的是不同版本的 LibJingle 或由于任何原因这不起作用,请告诉我,我很乐意为您提供帮助!

干杯,

【讨论】:

通话时如何更改?【参考方案4】:

创建一个新的视频捕捉器并启动它。不要忘记停止旧的。

fun switchCamera() 
    cameraFacingFront = !cameraFacingFront
    try 
        videoCapturer!!.stopCapture()
     catch (e: InterruptedException) 
    
    videoCapturer = createVideoCapturer(cameraFacingFront)
    videoCapturer!!.initialize(
        surfaceTextureHelper,
        activity,
        videoSource!!.getCapturerObserver()
    )
    videoCapturer!!.startCapture(
        VIDEO_SIZE_WIDTH,
        VIDEO_SIZE_HEIGHT,
        VIDEO_FPS
    )

【讨论】:

以上是关于在android webrtc中切换相机(后/前)的主要内容,如果未能解决你的问题,请参考以下文章

android 4.2的版本 照相机界面切换至前摄像头,按返回后再进照相在后摄像头,进去应还在前摄像头

在 webrtc 中使用 MediaDevices.getUserMedia() 切换相机

在pjsip android中从前到后切换相机

Android WebRTC 入门教程 -- 使用相机

Android WebRTC 入门教程 -- 使用相机

在 AppRTCDemo 中将视频作为相机播放