为流式视频打开 Android 相机时出错

Posted

技术标签:

【中文标题】为流式视频打开 Android 相机时出错【英文标题】:Error opening android camera for streaming video 【发布时间】:2012-02-24 06:35:09 【问题描述】:

我正在尝试将视频流从我的 Galaxy Tab 写入服务器。 根据this manual,我应该这样做:

        frontCamera = getFrontCamera();
        if((socket!= null)&&(frontCamera!=null))
        
            try 
                frontCamera.setPreviewDisplay(cameraPreview.getHolder());
             catch (IOException e1) 
                // TODO Auto-generated catch block
                Log.e("","",e1);

            
            frontCamera.startPreview();
            recorder =  new MediaRecorder();
            frontCamera.unlock();
            recorder.setCamera(frontCamera);
            recorder.setAudiosource(MediaRecorder.AudioSource.CAMCORDER);
            recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
            recorder.setProfile(CamcorderProfile.get( CamcorderProfile.QUALITY_HIGH));
            pfd = ParcelFileDescriptor.fromSocket(socket);
            recorder.setOutputFile(pfd.getFileDescriptor());
            recorder.setPreviewDisplay(cameraPreview.getHolder().getSurface());
            try 
                recorder.prepare();
                recorder.start();
 catch (IllegalStateException e) 
                // TODO Auto-generated catch block
                Log.e("","",e);
             catch (IOException e) 
                // TODO Auto-generated catch block
                Log.e("","",e);
            

但在步骤 recorder.start(); 上所有操作都失败并出现奇怪的错误

02-01 19:03:39.265: E/MediaRecorder(11922): start failed: -19

这是什么意思,我应该怎么做才能启动记录器?

更新: 由于我的 getFrontCamera 方法而发生了问题。当我用 camera.open() 替换它时,一切正常。

protected Camera getFrontCamera()

    Camera.CameraInfo inf = new Camera.CameraInfo();
    for(int i = 0; i< Camera.getNumberOfCameras(); i++)
    

        Camera.getCameraInfo(i, inf);
        if(inf.facing==Camera.CameraInfo.CAMERA_FACING_FRONT)
        
            return Camera.open(i);
        
    
    return null;

Upd2 - 是的,格式和编码器的显式设置解决了问题 -

        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);

也许是因为预构建格式适用于后置摄像头......但无论如何都很奇怪。

【问题讨论】:

【参考方案1】:

我没有看到输出格式设置,所以尝试添加到记录器设置:

 recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);

【讨论】:

据我所知,这是通过 recorder.setProfile(...) 完成的。 哦,我追查到 -19 是 NO_INIT 的值,并且很可能在 (*cameraSource)->initCheck() 不正常时从 setupCameraSource 返回。 我在 IC 4.0.4 上的 Nexus S 上遇到了与那个神秘错误 -19 完全相同的问题。所以,它对我有用的是明确将帧速率设置为 @nifo 你曾经能够以高于 15fps 的速度进行录制吗?我正在使用声称能够以 24fps 录制的 Galaxy nexus,但当我尝试高于 15 时,它会以相同的方式崩溃。请参阅***.com/questions/11156509/…【参考方案2】:

有一个look

虽然它是流媒体视频,所以设置 -

recorder.setOutputFormat(8);
recorder.setOutputFile(socketFd);

玩得开心。

【讨论】:

【参考方案3】:

我在这里有一个技巧,扩展媒体记录器类并删除 super.setVideoFrameRate(rate) 为我解决了问题。

【讨论】:

这和不调用它是一样的。没有帮助。【参考方案4】:

如果你还想在前置摄像头上使用CamcorderProfile.QUALITY_HIGH,你可以使用如下:

CamcorderProfile camcorderProfile = CamcorderProfile.get(currentCameraId, CamcorderProfile.QUALITY_HIGH);
recorder.setProfile(camcorderProfile);

其中int currentCameraIdCamera.CameraInfo.CAMERA_FACING_BACK...FRONT

因此配置文件确实取决于相机(对于高端手机,它似乎可以正常工作而没有区别,因为它们现在都支持 1080p,但低端手机可能会崩溃)

【讨论】:

以上是关于为流式视频打开 Android 相机时出错的主要内容,如果未能解决你的问题,请参考以下文章

将实时视频广播从 android 相机流式传输到服务器

将实时视频从 Raspberry Pi 流式传输到我的 Android 应用程序,但出现安全异常

通过 RTMP 流式传输 android 相机

Android Emulator 运行简单项目时出错

Android - 将视频从摄像头流式传输到另一个Android设备

您可以通过蓝牙实时流式传输相机吗?