Запись видео с Camera2 API - CodecException: ошибка 0xfffffc0e - PullRequest
0 голосов
/ 09 июня 2019

Мое приложение записывает аудио / видео в файл 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; 
...

Я думаю, мойОсновные вопросы:

  1. Существует ли наилучший способ проверки возможностей кодека устройства?
  2. Выглядят ли мои входные конфигурации довольно стандартно?
  3. Правильно ли яинициирование кодека?
...