2017-06-26 86 views
0

我試圖記錄使用https://github.com/saki4510t/ScreenRecordingSample/tree/master/app/src/main/java/com/serenegiant/media屏幕,並提供一些相關的代碼片段:MediaCodec CodecException在三星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 
} 

它適用於大部分設備而不是三星Galaxy Note 4運行Android 6.0。 1。我在哪裏得到以下錯誤。

`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

請發佈LogCat輸出。您可以使用三星在線測試實驗室獲取它:http://developer.samsung.com/remotetestlab/rtlDeviceList.action?os=101 – user1643723

回答

0

經過大量的brainstroming,我們發現問題是與高度和寬度。下面是代碼爲我們工作。

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; 
} 
相關問題