마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

TextrueView MediaPlayer 재생 오류

0 추천

안녕하십니까

 

sd카드에 있는 14메가가 되는 동영사응ㄹ 재생하려고 하는데 아래와 같은 오류가 뜹니다. server이야기 하는데 인터넷쪽 연결은 하지 않구요 ㅜㅜ

private void initView(){

mTextureView =(TextureView)findViewById(R.id.playback_video);

mTextureView.setSurfaceTextureListener(this);

}

 

@Override

public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width,

int height) {

Surface surface = new Surface(surfaceTexture);

 

mMediaPlayer= new MediaPlayer();

mMediaPlayer.reset();

    mMediaPlayer.setDataSource(sd+"/afile_6226.mp4");

    mMediaPlayer.setOnErrorListener(this);

    mMediaPlayer.setSurface(surface);

    surface.release();

    mMediaPlayer.prepareAsync();

   

    mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

@Override

public void onPrepared(MediaPlayer mp) {

mp.start();

}

});

 

 

 

 

@Override

public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width,

int height) {

 

}

@Override

public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {

surface.release();

return true;

}

@Override

public void onSurfaceTextureUpdated(SurfaceTexture surface) {

// TODO Auto-generated method stub

 

}

 

 

@Override

public boolean onError(MediaPlayer mp, int what, int extra) {

Toast.makeText(getApplication(), what+"에러", Toast.LENGTH_SHORT).show();

return false;

}

 

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

 

if (mMediaPlayer != null) {

            mMediaPlayer.stop();

            mMediaPlayer.release();

            mMediaPlayer = null;

        }

}

에러 문구

09-23 11:44:07.003: W/AudioSystem(2166): AudioFlinger server died!
09-23 11:44:07.003: W/IMediaDeathNotifier(2166): media server died
09-23 11:44:07.003: E/MediaPlayer(2166): error (100, 0)
09-23 11:44:07.003: E/MediaPlayer(2166): Error (100,0)
 
흠바바 1 (4,000 포인트) 님이 2014년 9월 23일 질문

1개의 답변

0 추천
http://www.androidpub.com/2436259

같은 문제의 답변일겁니다

doridori2013@nate.com

 

익명사용자 님이 2014년 9월 23일 답변
답변 감사드립니다
저는 복수 재생을 실행하지 않습니다.
해당코드가 휴대폰에서는 잘되는데 miniPc에서 실행이안됩니다. 용량이작은 동영상만 되고 큰 용량은 저렇게 에러가 떠버립니다.
mMediaPlayer.setSurface(surface);
surface.release(); 부분이 의심스러운데요..
surface를 왜 이시점에 release 하시는건가요?
안녕하십니까 사악미소님
아 현재 저건 삭제하였습니다^^ 저거없어도 똑같은 에러가 발생하더라구요 ㅜㅜ
현재 miniPc라고 mk802라는 모델로 테스트중입니다.
4메가짜리 영상은 재새잉 되는데 10메가 넘어가는것은 재생이안됩니다.
하드웨어스펙문제인지지
 android:hardwareAccelerated="true"
        android:largeHeap="true"
        android:allowBackup="true"
하드웨어 가속도 줬구요 os는 4.0.4 입니다. 이유를 정확히 몰라서  추측인건 그냥 미니Pc의 스펙이 안좋아서라고 봐야하는지 VideoView에서는 또 재생이 잘됩니다 ㅜㅜ
에러 코드 100은   MEDIA_ERROR_SERVER_DIED 으로  말 그대로 미디어 서버가 죽어서 발생하는 현상으로 보입니다.

아무래도  메모리 용량 제한으로 VM에서 미디어서버를 죽였거나, 내부에서 동작중 에러가 발생하여 미디어 서버가 죽은 것으로 보이나.  
 왜 미디어 서버가 죽었는지는  올려주신 로그로는 알 수 없네요... 로그를 추가해 주시면, 검토해 보도록 하겠습니다.
사악미소님 감사합니다.
하지만 로그가는 찍히는게 이게 전부 입니다 ㅜㅜ
09-24 10:34:08.800: D/ViewRootImpl(3801): pckname = com.example.videotest
09-24 10:34:08.850: D/libEGL(3801): loaded /system/lib/egl/libEGL_mali.so
09-24 10:34:08.870: D/libEGL(3801): loaded /system/lib/egl/libGLESv1_CM_mali.so
09-24 10:34:08.870: D/libEGL(3801): loaded /system/lib/egl/libGLESv2_mali.so
09-24 10:34:08.900: D/OpenGLRenderer(3801): Enabling debug mode 0
09-24 10:34:08.930: W/MediaPlayer(3801): setScreenOnWhilePlaying(true) is ineffective without a SurfaceHolder
09-24 10:34:11.930: W/AudioSystem(3801): AudioFlinger server died!
09-24 10:34:11.930: W/IMediaDeathNotifier(3801): media server died
09-24 10:34:11.930: E/MediaPlayer(3801): error (100, 0)
09-24 10:34:11.930: E/MediaPlayer(3801): Error (100,0)
09-24 10:37:30.370: D/AndroidRuntime(3837): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
09-24 10:37:30.370: D/AndroidRuntime(3837): CheckJNI is OFF
09-24 10:37:30.610: D/AndroidRuntime(3837): Calling main entry com.android.commands.pm.Pm
09-24 10:37:30.640: D/AndroidRuntime(3837): Shutting down VM
09-24 10:37:30.650: D/dalvikvm(3837): GC_CONCURRENT freed 101K, 82% free 468K/2560K, paused 1ms+0ms
09-24 10:37:30.650: D/dalvikvm(3837): Debugger has detached; object registry had 1 entries
09-24 10:37:30.650: I/AndroidRuntime(3837): NOTE: attach of thread 'Binder Thread #3' failed
09-24 10:37:31.000: D/AndroidRuntime(3850): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
09-24 10:37:31.000: D/AndroidRuntime(3850): CheckJNI is OFF
09-24 10:37:31.250: D/AndroidRuntime(3850): Calling main entry com.android.commands.am.Am
09-24 10:37:31.260: I/ActivityManager(168): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.example.videotest/.MainActivity} from pid 3850
09-24 10:37:31.280: D/ViewRootImpl(168): pckname = com.example.videotest
09-24 10:37:31.310: D/AndroidRuntime(3850): Shutting down VM
09-24 10:37:31.320: D/OpenGLRenderer(340): Flushing caches (mode 1)
09-24 10:37:31.330: D/dalvikvm(3850): GC_CONCURRENT freed 102K, 81% free 490K/2560K, paused 0ms+1ms
09-24 10:37:31.330: D/dalvikvm(3850): Debugger has detached; object registry had 1 entries
09-24 10:37:31.350: I/AndroidRuntime(3850): NOTE: attach of thread 'Binder Thread #3' failed
09-24 10:37:31.390: D/ViewRootImpl(3801): pckname = com.example.videotest
09-24 10:37:31.480: D/OpenGLRenderer(340): Flushing caches (mode 0)
09-24 10:37:31.500: D/CDX_Player(3827): >>>>>>>> CedarX Player Version: 00010800
09-24 10:37:31.500: I/CedarPlayerWrapper(3827): setDataSource('/mnt/sdcard/afile_6226.mp4')
09-24 10:37:31.510: I/CedarXPlayer(3827): use render GPU 0
09-24 10:37:31.510: W/MediaPlayer(3801): setScreenOnWhilePlaying(true) is ineffective without a SurfaceHolder
09-24 10:37:31.530: I/ActivityManager(168): Displayed com.example.videotest/.MainActivity: +238ms
09-24 10:37:31.560: D/osal_linux(3827): init hw ref count:1
09-24 10:37:31.580: D/VideoDec_Component(3827): vdec touch cpu freq
09-24 10:37:31.600: D/AudioDec_Component(3827): touch cpu freq
09-24 10:37:31.610: D/CedarXPlayer(3827): video render size:1920x1080
09-24 10:37:31.610: A/CedarXNativeRenderer(3827): frameworks/base/media/CedarX-Projects/CedarXAndroid/IceCreamSandwich/CedarXNativeRenderer.cpp:75 CHECK_EQ( 0,native_window_set_buffers_geometryex( mNativeWindow.get(), bufWidth, bufHeight, halFormat, screenID)) failed: 0 vs. 100
09-24 10:37:31.610: A/libc(3827): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1)
09-24 10:37:32.110: I/DEBUG(85): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
09-24 10:37:32.110: I/DEBUG(85): Build fingerprint: 'softwinners/apollo_mele/apollo-mele:4.0.4/IMM76D/20130506:eng/test-keys'
09-24 10:37:33.980: I/BootReceiver(168): Copying /data/tombstones/tombstone_02 to DropBox (SYSTEM_TOMBSTONE)
09-24 10:37:33.990: W/AudioSystem(168): AudioPolicyService server died!
09-24 10:37:33.990: I/ServiceManager(82): service 'media.audio_policy' died
09-24 10:37:33.990: I/ServiceManager(82): service 'media.audio_flinger' died
09-24 10:37:33.990: I/ServiceManager(82): service 'media.player' died
09-24 10:37:33.990: I/ServiceManager(82): service 'media.camera' died
09-24 10:37:33.990: W/AudioSystem(3801): AudioFlinger server died!
09-24 10:37:33.990: W/IMediaDeathNotifier(3801): media server died
09-24 10:37:33.990: E/MediaPlayer(3801): error (100, 0)
09-24 10:37:33.990: E/MediaPlayer(3801): Error (100,0)
09-24 10:37:34.000: W/AudioSystem(168): AudioFlinger server died!
09-24 10:37:34.110: D/dalvikvm(168): GC_CONCURRENT freed 454K, 13% free 10903K/12487K, paused 4ms+5ms
09-24 10:37:34.210: D/dalvikvm(168): GC_FOR_ALLOC freed 198K, 14% free 10832K/12487K, paused 81ms
09-24 10:37:34.310: D/dalvikvm(168): GC_FOR_ALLOC freed 555K, 16% free 10597K/12487K, paused 85ms
09-24 10:37:34.400: I/(3870): ServiceManager: 0xf9b0
09-24 10:37:34.400: D/audio_hw_primary(3870): read card /sys/class/sound/card0/id
09-24 10:37:34.400: D/audio_hw_primary(3870): /sys/class/sound/card0/id, audiocodec, len: 11
09-24 10:37:34.400: D/audio_hw_primary(3870): find name map
09-24 10:37:34.400: D/audio_hw_primary(3870): linux name = audiocodec, android name = AUDIO_CODEC
09-24 10:37:34.400: D/audio_hw_primary(3870): read card /sys/class/sound/card1/id
09-24 10:37:34.400: D/audio_hw_primary(3870): /sys/class/sound/card1/id, sndhdmi, len: 8
09-24 10:37:34.400: D/audio_hw_primary(3870): find name map
09-24 10:37:34.400: D/audio_hw_primary(3870): linux name = sndhdmi, android name = AUDIO_HDMI
09-24 10:37:34.400: D/audio_hw_primary(3870): read card /sys/class/sound/card2/id
09-24 10:37:34.400: D/audio_hw_primary(3870): /sys/class/sound/card2/id, sndspdif, len: 9
09-24 10:37:34.400: D/audio_hw_primary(3870): find name map
09-24 10:37:34.400: D/audio_hw_primary(3870): linux name = sndspdif, android name = AUDIO_SPDIF
09-24 10:37:34.410: I/AudioFlinger(3870): Loaded primary audio interface from sunxi audio HW HAL (audio)
09-24 10:37:34.410: I/AudioFlinger(3870): Using 'sunxi audio HW HAL' (audio.primary) as the primary audio interface
09-24 10:37:34.410: I/CameraService(3870): CameraService started (pid=3870)
09-24 10:37:34.420: I/AudioFlinger(3870): AudioFlinger's thread 0x1ab88 ready to run
09-24 10:37:34.420: I/AudioPolicyService(3870): Loaded audio policy from LEGACY Audio Policy HAL (audio_policy)
09-24 10:37:35.500: E/AudioService(168): Media server died.
09-24 10:37:35.510: E/AudioService(168): Media server started.
09-24 10:37:35.510: W/AudioPolicyManagerBase(3870): setPhoneState() setting same state 0
09-24 10:41:45.610: I/EventLogService(400): Aggregate from 1411521105548 (log), 1411521105548 (data)
로그 상
09-24 10:37:31.610: A/CedarXNativeRenderer(3827): frameworks/base/media/CedarX-Projects/CedarXAndroid/IceCreamSandwich/CedarXNativeRenderer.cpp:75 CHECK_EQ( 0,native_window_set_buffers_geometryex( mNativeWindow.get(), bufWidth, bufHeight, halFormat, screenID)) failed: 0 vs. 100
부분이 문제입니다.
CedarXNativeRenderer.cpp 파일의 75라인에서 반횐되는 값이 0이길 기대했으나 100이 반환되어 처리를 못하다보니 강제적으로 미디어 서버를 강종 시킨 듯 합니다.
native_window_set_buffers_geometryex 가 성공시 0이 반환될 듯 한데.
무슨이유에서인지 실패하는 듯 합니다.

CedarXNativeRenderer.cpp  파일은 구글에서 공개한 소스가 아니라.
단말 제조사에서 추가한 렌더러 부분으로 보이네요...
아무래도 해당 단말에서 TextrueView 기능을 100% 지원하지 못하는 경우가 있는 듯 합니다.

그냥 단말 특성이라 생각하셔야 할 듯 하네요....
사악미소님 감사합니다.. 그럼 어떻게 해서든 불가능 하단 말씀이시죠?
제가 이렇게 한이유 TextrueView 를 회전기능을 할수없어서
미니pc나 이런건 회전기능이없어서 동영상이 회전이 안되어서 이걸이용해서 회전하였는데요
videoview나 서페이스뷰를 이용한 방법으로 화면을 회전 강제 회전하는방법은 없을까요
글세요
 videoview나 surfaceview는 holder를 texure로 주지 않는 이상  영상처리가 안되는데. texure 에서 오류가 생겼으니..   마땅한 방법이 안 떠오르네요..
그렇다고 native를 수정하는 것도 어려울 듯 하고요...

될지 모르지만 GLSurfaceView를 사용 해보시는 것도 방안일 듯 하며,
화면 회전 이벤트를 강제로 줘서 회전을 시켜보시는것도 좋을 듯 합니다.
http://stackoverflow.com/questions/10257594/how-control-screen-orientation-of-android-device
저기 나오는 회전이... 해당기기가 회전기능을 지원하지않으니까 아무리해도 아무반응이 없더라구요.. 휴대폰에서만 대는거 같아요 회전기능이 되는 기기요
GLSurfaceView를 이용해서 해봤습니다. 재생은 잘되는데.
회전 문제때문에 회전이 glsurfaceview를
msurfaceview.setrotate(90);을 주니 비디오뷰 회전주는거와 같이 화면이 안나옵니다.
mSurfaceView = new GLSurfaceView(this);
        linearLayout.addView(mSurfaceView, 600, 400);
        setContentView(linearLayout);

        mSurfaceView.setRenderer(new Renderer() {

            @Override
            public void onSurfaceCreated(GL10 gl, EGLConfig config) {
                Log.e("kim", "onSurfaceCreated");
            }

            @Override
            public void onSurfaceChanged(GL10 gl, int width, int height) {
                Log.e("kim", "onSurfaceChanged");
            }

            @Override
            public void onDrawFrame(GL10 gl) {
                Log.e("kim", "onDrawFrame");
            }
        });

        mSurfaceView.getHolder().addCallback(new Callback() {

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                mMediaPlayer.release();
            }

            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                playback();
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    private void playback() {
        mMediaPlayer = new MediaPlayer();
        try {
            mMediaPlayer.setDataSource(Environment.getExternalStorageDirectory().getPath() + "/afile_6227.mp4");
            mMediaPlayer.setDisplay(mSurfaceView.getHolder());
            mMediaPlayer.prepare();
            mMediaPlayer.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
...