Ошибка запуска медиа-рекордера: 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 сообщит вам об этом