2017-06-26 4 views
0

Je suis en train d'enregistrer l'écran en utilisant https://github.com/saki4510t/ScreenRecordingSample/tree/master/app/src/main/java/com/serenegiant/media et fourni quelques extrait de code connexe:MediaCodec CodecException dans Samsung Galaxy Note 4

@Override 
void prepare() throws IOException { 
    if (DEBUG) Log.i(TAG, "prepare: "); 
    mSurface = prepare_surface_encoder(MIME_TYPE, fps, bitrate); 
    mMediaCodec.start(); 
    mIsRecording = true; 
    new Thread(mScreenCaptureTask, "ScreenCaptureThread").start(); 
    if (DEBUG) Log.i(TAG, "prepare finishing"); 
    if (mListener != null) { 
     try { 
      mListener.onPrepared(this); 
     } catch (final Exception e) { 
      Log.e(TAG, "prepare:", e); 
     } 
    } 
} 
protected MediaFormat create_encoder_format(final String mime, final int frame_rate, final int bitrate) { 
    if (DEBUG) Log.v(TAG, String.format("create_encoder_format:(%d,%d),mime=%s,frame_rate=%d,bitrate=%d", mWidth, mHeight, mime, frame_rate, bitrate)); 
    final MediaFormat format = MediaFormat.createVideoFormat(mime, mWidth, mHeight); 
    format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface); // API >= 18 
    format.setInteger(MediaFormat.KEY_BIT_RATE, bitrate > 0 ? bitrate : calcBitRate(frame_rate)); //800000 
    format.setInteger(MediaFormat.KEY_FRAME_RATE,30); 
    format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 10); 
    return format; 
} 

protected Surface prepare_surface_encoder(final String mime, final int frame_rate, final int bitrate) 
    throws IOException, IllegalArgumentException { 

    if (DEBUG) Log.v(TAG, String.format("prepare_surface_encoder:(%d,%d),mime=%s,frame_rate=%d,bitrate=%d", mWidth, mHeight, mime, frame_rate, bitrate)); 

    mTrackIndex = -1; 
    mMuxerStarted = mIsEOS = false; 

    final MediaCodecInfo videoCodecInfo = selectVideoCodec(mime); 
    if (videoCodecInfo == null) { 
     throw new IllegalArgumentException("Unable to find an appropriate codec for " + mime); 
    } 
    if (DEBUG) Log.i(TAG, "selected codec: " + videoCodecInfo.getName()); 

    final MediaFormat format = create_encoder_format(mime, frame_rate, bitrate); 
    if (DEBUG) Log.i(TAG, "format: " + format); 

    mMediaCodec = MediaCodec.createEncoderByType(mime); 
    mMediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); 
    // get Surface for encoder input 
    // this method only can call between #configure and #start 
    return mMediaCodec.createInputSurface(); // API >= 18 
} 

Il fonctionne pour la plupart des appareils, mais pas pour Samsung Galaxy Note 4 fonctionnant sous Android 6.0. 1. Où je reçois erreur suivante.

`Non-fatal Exception: android.media.MediaCodec$CodecException: Error 0xffffec77 
    at android.media.MediaCodec.native_configure(MediaCodec.java) 
    at android.media.MediaCodec.configure(MediaCodec.java:1778) 
    at com.urcaddy.utilities.utils.media.MediaVideoEncoderBase.prepare_surface_encoder(MediaVideoEncoderBase.java:90) 
    at com.urcaddy.utilities.utils.media.MediaScreenEncoder.prepare(MediaScreenEncoder.java:87) 
    at com.urcaddy.utilities.utils.media.MediaMuxerWrapper.prepare(MediaMuxerWrapper.java:74) 
    at com.urcaddy.services.backgroundservices.ScreenRecorderService.startScreenRecord(ScreenRecorderService.java:229) 
    at com.urcaddy.services.backgroundservices.ScreenRecorderService.onStartCommand(ScreenRecorderService.java:139) 
    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4062) 
    at android.app.ActivityThread.access$2400(ActivityThread.java:221) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1897) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:158) 
    at android.app.ActivityThread.main(ActivityThread.java:7225) 
    at java.lang.reflect.Method.invoke(Method.java) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)` 
+0

Veuillez également publier la sortie LogCat. Vous pouvez l'obtenir en utilisant le laboratoire de test en ligne de Samsung: http://developer.samsung.com/remotetestlab/rtlDeviceList.action?os=101 – user1643723

Répondre

0

Après beaucoup de brainstroming, nous avons constaté que la question était à la hauteur et width.Below est le code qui a fonctionné pour nous.

protected MediaFormat create_encoder_format(final String mime, final int frame_rate, final int bitrate) { 
if (DEBUG) Log.v(TAG, String.format("create_encoder_format:(%d,%d),mime=%s,frame_rate=%d,bitrate=%d", 720, 1280, mime, frame_rate, bitrate)); 
final MediaFormat format = MediaFormat.createVideoFormat(mime, 720, 1280); 
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface); // API >= 18 
format.setInteger(MediaFormat.KEY_BIT_RATE, bitrate > 0 ? bitrate : calcBitRate(frame_rate)); //800000 
format.setInteger(MediaFormat.KEY_FRAME_RATE,30); 
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 10); 
return format; 
}