Ошибка запуска медиа-рекордера: MEDIA_ERROR_UNSUPPORTED (ошибка запуска: -1010) при попытке записи видео в сокет

Я пытаюсь реализовать решение из этого SO-ответа для записи видео в сокет (а затем прочитать его из сокета на стороне проигрывателя, когда конечная цель - транслировать видео в реальном времени)

но при попытке вызвать start() madiarecorder возникает исключение: start fail:-1010

API говорит об этой константе:

общедоступный статический финал int MEDIA_ERROR_UNSUPPORTED

Добавленный в API уровень 17 Битовый поток соответствует стандарту связанного кодирования или спецификации файла, но среда мультимедиа не поддерживает эту функцию.

но я предполагаю, что если люди проверят этот ответ, чтобы он был эффективным, то он каким-то образом поддерживается, поэтому, пожалуйста,

укажите на меня, в чем моя ошибка??

вот код, который я использую:

public class MainActivity extends Activity {

    private Camera mCamera;
    private MediaRecorder mMediaRecorder;
    private Socket socket;
    private Preview mPreView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        setContentView(R.layout.activity_main);
        try {

            socket = new Socket("10.0.0.4",8080);
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // this is your network socket
        ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
        mPreView=new Preview(this);
        mCamera = getCameraInstance();
        mMediaRecorder = new MediaRecorder();
        mCamera.lock();
        mCamera.unlock();
        mMediaRecorder.setCamera(mCamera);
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        // this is the unofficially supported MPEG2TS format, suitable for
        // streaming (Android 3.0+)
        mMediaRecorder.setOutputFormat(8);
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
        mMediaRecorder.setOutputFile(pfd.getFileDescriptor());
    //  mMediaRecorder.setPreviewDisplay(null);
        try {
            mMediaRecorder.prepare();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        mMediaRecorder.start();
    }

    /** A safe way to get an instance of the Camera object. */
    public static Camera getCameraInstance() {
        Camera c = null;
        try {
            c = Camera.open(); // attempt to get a Camera instance
        } catch (Exception e) {
            // Camera is not available (in use or does not exist)
        }
        return c; // returns null if camera is unavailable
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    class Preview extends ViewGroup implements SurfaceHolder.Callback
    {
SurfaceView mSurface;
SurfaceHolder mHolder;
        public Preview(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
            mSurface=new SurfaceView(context);
            addView(mSurface);
            mHolder=mSurface.getHolder();
        }
        @Override
        public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
                int arg3) {
            // TODO Auto-generated method stub

        }
        @Override
        public void surfaceCreated(SurfaceHolder arg0) {
            // TODO Auto-generated method stub

        }
        @Override
        public void surfaceDestroyed(SurfaceHolder arg0) {
            // TODO Auto-generated method stub

        }
        @Override
        protected void onLayout(boolean arg0, int arg1, int arg2, int arg3,
                int arg4) {
            // TODO Auto-generated method stub

        }

    }

}

почему медиа-рекордер не поддерживает его? и как я могу это решить?

спасибо, что уделили время.

2 ответа

Решение

Я нашел решение:

Я заменил эту строку:

mMediaRecorder.setOutputFormat(8);

с этим:

mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

При неудачном запуске MediaRecorder важно проверить настройки медиа-рекордера и убедиться, что они все возможны для вашего оборудования, поэтому я бы проверил такие вещи, как:

mMediaRecorder.setVideoSource();
mMediaRecorder.setOutputFormat();
mMediaRecorder.setVideoEncoder();

и т.п.

Если что-то из этого является неправильным или недоступным для оборудования, то MediaRecorder сообщит вам об этом

Другие вопросы по тегам