Мое приложение записывает аудио / видео в файл MP4.Я использую Android MediaMuxer
вместо MediaRecorder
для генерации выходных файлов, так как мое приложение захватывает видеокадры и обрабатывает их в режиме реального времени, пока пользователь записывает.Я использую ImageReader
для захвата кадров.
В последнее время я получаю сообщения об ошибках от некоторых устройств после запуска видеокодека, но сообщение об ошибке Error 0xfffffc0e
не помогает иМне не удалось найти какую-либо полезную информацию в Интернете об ошибке.Вот пример трассировки стека:
android.media.MediaCodec$CodecException: Error 0xfffffc0e
android.media.MediaCodec.native_configure(Native Method)
android.media.MediaCodec.configure(MediaCodec.java:1791)
XXX.MainActivity.setupMediaMuxer(MainActivity.java:2286)
XXX.MainActivity.startRecordingVideo(MainActivity.java:1623)
XXX.MainActivity.recordButton(MainActivity.java:3768)
...
Вот соответствующий код:
private void setupMediaMuxer() {
String videoMimeType = MediaFormat.MIMETYPE_VIDEO_MPEG4;
try {
videoCodec = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_MPEG4);
MediaCodecInfo videoCodecInfo = videoCodec.getCodecInfo();
MediaFormat videoFormat = MediaFormat.createVideoFormat(videoMimeType, mVideoSize.getWidth(), mVideoSize.getHeight());
int colorFormatSelected = selectColorFormat(videoCodecInfo, videoMimeType); //MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible
videoFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormatSelected);
if (colorFormatSelected == 0) {
showError();
return;
}
videoFormat.setInteger(MediaFormat.KEY_BIT_RATE, VIDEO_BIT_RATE);
videoFormat.setInteger(MediaFormat.KEY_FRAME_RATE, VIDEO_FRAME_RATE);
videoFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, VIDEO_FRAME_INTERVAL);
videoFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 0);
videoCodec.configure(videoFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); //Exception happens here.
videoCodec.start();
} catch (Exception e)
{
e.printStackTrace();
return;
}
...
}
Вот мои параметры конфигурации кодека:
final int VIDEO_FRAME_RATE = 30;
final int VIDEO_BIT_RATE = 10000000;
final int VIDEO_FRAME_INTERVAL = 1;
final int VIDEO_WIDTH = 1280;
final int VIDEO_HEIGHT = 720;
...
Я думаю, мойОсновные вопросы:
- Существует ли наилучший способ проверки возможностей кодека устройства?
- Выглядят ли мои входные конфигурации довольно стандартно?
- Правильно ли яинициирование кодека?