2011-08-20 5 views
-4

Android에서 비디오를 재생할 때이 Java 코드를 사용하고 있습니다. 그러나 검은 화면 만 보여주고 있습니다.Android에 비디오 화면이 표시되지 않습니다.

어떻게 해결할 수 있습니까?

package org.apache.android.media; 

import android.app.Activity; 
import android.content.Context;  
import android.graphics.PixelFormat;  
import android.media.AudioManager; 
import android.media.MediaPlayer;  
import android.media.MediaPlayer.OnBufferingUpdateListener;  
import android.media.MediaPlayer.OnCompletionListener; 
import android.media.MediaPlayer.OnErrorListener;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.SurfaceHolder;  
import android.view.SurfaceView;  
import android.view.View;  
import android.webkit.URLUtil; 
import android.widget.EditText;  
import android.widget.ImageButton; 
import java.io.File; 
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.net.URL;  
import java.net.URLConnection; 

public class VideoViewDemo extends Activity implements OnErrorListener, 

    OnBufferingUpdateListener, OnCompletionListener, 

    MediaPlayer.OnPreparedListener, SurfaceHolder.Callback { 

private static final String TAG = "VideoPlayer"; 

private MediaPlayer mp; 
private SurfaceView mPreview; 
private EditText mPath; 
private SurfaceHolder holder; 
private ImageButton mPlay; 
private ImageButton mPause; 
private ImageButton mReset; 
private ImageButton mStop; 
private String current; 
private boolean mIsVideoSizeKnown = false; 
private boolean mIsVideoReadyToBePlayed = false; 
public File cacheDir; 
public Context con; 

/** 
* Called when the activity is first created. 
*/ 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 

    setContentView(R.layout.main); 
    cacheDir = this.getCacheDir(); 
    // Set up the play/pause/reset/stop buttons 
    mPreview = (SurfaceView) findViewById(R.id.surface); 
    mPath = (EditText) findViewById(R.id.path); 
    mPlay = (ImageButton) findViewById(R.id.play); 
    mPause = (ImageButton) findViewById(R.id.pause); 
    mReset = (ImageButton) findViewById(R.id.reset); 
    mStop = (ImageButton) findViewById(R.id.stop); 
    // mPath.setText("http://cityslicker.user.slicker.tech.googlewave.com.s3.amazonaws.com/video.slicker.tech.googlewave.com.3.21.110.9.23.11.914.mp4"); 
    mPath.setText("http://daily3gp.com/vids/747.3gp"); 
    mPlay.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      playVideo(); 
     } 
    }); 
    mPause.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      if (mp != null) { 
       mp.pause(); 
      } 
     } 
    }); 
    mReset.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      if (mp != null) { 
       mp.seekTo(0); 
      } 
     } 
    }); 
    mStop.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      if (mp != null) { 
       mp.stop(); 
       mp.release(); 
      } 
     } 
    }); 

    // Set the transparency 
    getWindow().setFormat(PixelFormat.TRANSPARENT); 

    // Set a size for the video screen 
    holder = mPreview.getHolder(); 
    holder.addCallback(this); 
    // holder.setFixedSize(400, 300); 
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    // playVideo(); 
} 

private void playVideo() { 
    try { 
     final String path = mPath.getText().toString(); 
     Log.v(TAG, "path: " + path); 

     // If the path has not changed, just start the media player 
     if (path.equals(current) && mp != null) { 
      mp.start(); 
      return; 
     } 
     current = path; 

     // Create a new media player and set the listeners 
     mp = new MediaPlayer(); 
     // setDataSource(path); 
     // File file = new File(setDataSource(path)); 
     // FileInputStream fis = new FileInputStream(file); 
     // chk for file is exists or not 
     if (false) { 
      File file = new File(this.getCacheDir(), 
        "mediaplayertmp28220.3gp"); 
      FileInputStream fis = new FileInputStream(file); 
      // String audioFilePath = getFilesDir().getAbsolutePath() + 
      // File.separator + "test.mp4"; 
      mp.setDataSource(fis.getFD()); 
      // Set the surface for the video output 
      mp.setDisplay(holder); 
      mp.prepareAsync(); 
     } else { 
      /* 
      * Runnable r = new Runnable() { public void run() { try { 
      * 
      * // setDataSource(path); 
      * 
      * } catch (IOException e) { Log.e(TAG, e.getMessage(), e); } 
      * Log.v(TAG, "Duration: ===>"); //mp.start(); 
      * 
      * } }; new Thread(r).start(); 
      */ 

     } 
     // mp.prepare(); 
     mp.setDataSource(path); 
     mp.prepare(); 
     mp.setDisplay(holder); 
     mp.setOnErrorListener(this); 
     mp.setOnBufferingUpdateListener(this); 
     mp.setOnCompletionListener(this); 
     mp.setOnPreparedListener(this); 
     // holder.setFixedSize(200, 200); 
     mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     // mp.start(); 
     // mp.setAudioStreamType(2); 
     /* 
     * mMediaPlayer.setDisplay(holder); mMediaPlayer.prepare(); 
     * mMediaPlayer.setOnBufferingUpdateListener(this); 
     * mMediaPlayer.setOnCompletionListener(this); 
     * mMediaPlayer.setOnPreparedListener(this); 
     * mMediaPlayer.setOnVideoSizeChangedListener(this); 
     * mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     */ 

     // Set the data source in another thread 
     // which actually downloads the mp3 or videos 
     // to a temporary location 

    } catch (Exception e) { 
     Log.e(TAG, "error: " + e.getMessage(), e); 
     if (mp != null) { 
      mp.stop(); 
      mp.release(); 
     } 
    } 
} 

/** 
* If the user has specified a local url, then we download the url stream to 
* a temporary location and then call the setDataSource for that local file 
* 
* @param path 
* @throws IOException 
*/ 
private void setDataSource(String path) throws IOException { 
    String tempPath = null; 
    FileInputStream fis; 
    InputStream stream; 
    { 
     URL url = new URL(path); 
     URLConnection cn = url.openConnection(); 
     cn.connect(); 
     stream = cn.getInputStream(); 
     if (stream == null) 
      throw new RuntimeException("stream is null"); 
     File temp = File.createTempFile("mediaplayertmp", ".mp4", 
       this.getCacheDir()); 
     tempPath = temp.getAbsolutePath(); 
     fis = new FileInputStream(temp); 
     FileOutputStream out = new FileOutputStream(temp); 
     byte buf[] = new byte[1024]; 
     do { 
      int numread = stream.read(buf); 
      if (numread <= 0) 
       break; 
      out.write(buf, 0, numread); 
     } while (true); 
    } 
    mp.setDataSource(fis.getFD()); 
    mp.setDisplay(holder); 
    mp.prepareAsync(); 
    try { 
     stream.close(); 
    } catch (IOException ex) { 
     Log.e(TAG, "error: " + ex.getMessage(), ex); 
    } 

} 

public boolean onError(MediaPlayer mediaPlayer, int what, int extra) { 
    Log.e(TAG, "onError---> what:" + what + " extra:" + extra); 
    if (mediaPlayer != null) { 
     mediaPlayer.stop(); 
     mediaPlayer.release(); 
     return true; 
    } 
    return false; 
} 

public void onBufferingUpdate(MediaPlayer arg0, int percent) { 
    Log.d(TAG, "onBufferingUpdate called ---> percent:" + percent 
      + " pos:" + arg0.getCurrentPosition()); 
} 

public void onCompletion(MediaPlayer arg0) { 
    Log.d(TAG, "onCompletion called"); 
    mp.stop(); 
    mp.release(); 
} 

public void onPrepared(MediaPlayer mediaplayer) { 
    Log.d(TAG, "onPrepared called"); 
    mIsVideoReadyToBePlayed = true; 
    mIsVideoSizeKnown = true; 
    if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) { 
     startVideoPlayback(); 
    } 
} 

private void startVideoPlayback() { 
    Log.v(TAG, "startVideoPlayback"); 
    holder.setFixedSize(200, 200); 
    mp.start(); 
} 

public void surfaceCreated(SurfaceHolder surfaceholder) { 
    Log.d(TAG, "surfaceCreated called"); 
} 

public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) { 
    Log.d(TAG, "surfaceChanged called"); 
} 

public void surfaceDestroyed(SurfaceHolder surfaceholder) { 
    Log.d(TAG, "surfaceDestroyed called"); 
} 
} 

내 로그 캣은있다 - 모든

 
08-22 11:26:42.566: DEBUG/AndroidRuntime(487): >>>>>>>>>>>>>> AndroidRuntime START /data/dalvik-cache/[email protected]@[email protected] 
08-22 11:26:45.326: DEBUG/PackageManager(58): New package installed in /data/app/org.apache.android.media-2.apk 
08-22 11:26:45.507: INFO/ActivityManager(58): Force stopping package org.apache.android.media uid=10048 
08-22 11:26:45.656: DEBUG/dalvikvm(58): GC_EXPLICIT freed 7280 objects/478776 bytes in 135ms 
08-22 11:26:45.856: WARN/RecognitionManagerService(58): no available voice recognition services found 
08-22 11:26:46.236: DEBUG/dalvikvm(58): GC_EXPLICIT freed 4010 objects/223072 bytes in 155ms 
08-22 11:26:46.286: INFO/installd(34): unlink /data/dalvik-cache/[email protected]@[email protected] 
08-22 11:26:46.297: DEBUG/AndroidRuntime(487): Shutting down VM 
08-22 11:26:46.307: DEBUG/dalvikvm(487): Debugger has detached; object registry had 1 entries 
08-22 11:26:46.336: INFO/AndroidRuntime(487): NOTE: attach of thread 'Binder Thread #3' failed 
08-22 11:26:47.426: DEBUG/AndroidRuntime(500): >>>>>>>>>>>>>> AndroidRuntime START prepare() 
08-22 11:27:12.644: INFO/Prefetcher(33): [0x14090] cache below low water mark, filling cache. 
08-22 11:27:13.996: INFO/AwesomePlayer(33): prefetcher is done preparing 
08-22 11:27:14.006: VERBOSE/MediaPlayerDemo(506): onVideoSizeChanged called 
08-22 11:27:14.016: DEBUG/MediaPlayerDemo(506): onPrepared called 
08-22 11:27:14.016: VERBOSE/MediaPlayerDemo(506): startVideoPlayback 
08-22 11:27:14.036: DEBUG/AudioSink(33): bufferCount (4) is too small and increased to 12 
08-22 11:27:14.066: ERROR/MemoryHeapBase(33): error opening /dev/pmem_adsp: No such file or directory 
08-22 11:27:14.066: INFO/SoftwareRenderer(33): Creating physical memory heap failed, reverting to regular heap. 
08-22 11:27:14.347: WARN/AudioFlinger(33): write blocked for 108 msecs, 1461 delayed writes, thread 0xb3f0 
08-22 11:27:15.126: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:7 
08-22 11:27:16.066: DEBUG/dalvikvm(291): GC_EXPLICIT freed 30 objects/1472 bytes in 797ms 
08-22 11:27:16.226: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:34 
08-22 11:27:17.326: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:34 
08-22 11:27:18.386: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:32 
08-22 11:27:18.477: DEBUG/SntpClient(58): request time failed: java.net.SocketException: Address family not supported by protocol 
08-22 11:27:19.362: WARN/AudioFlinger(33): write blocked for 74 msecs, 1497 delayed writes, thread 0xb3f0 
08-22 11:27:19.426: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:30 
08-22 11:27:20.346: DEBUG/dalvikvm(373): GC_EXPLICIT freed 409 objects/23448 bytes in 108ms 
08-22 11:27:20.486: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:30 
08-22 11:27:21.586: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:29 
08-22 11:27:22.607: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:33 
08-22 11:27:23.747: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:34 
08-22 11:27:24.427: WARN/AudioFlinger(33): write blocked for 87 msecs, 1537 delayed writes, thread 0xb3f0 
08-22 11:27:24.817: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:34 
08-22 11:27:25.856: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:39 
08-22 11:27:26.907: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:40 
08-22 11:27:27.996: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:41 
08-22 11:27:29.107: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:41 
08-22 11:27:29.437: WARN/AudioFlinger(33): write blocked for 95 msecs, 1577 delayed writes, thread 0xb3f0 
08-22 11:27:30.217: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:42 
08-22 11:27:31.288: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:44 
08-22 11:27:32.416: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:45 
08-22 11:27:33.466: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:45 
08-22 11:27:34.536: WARN/AudioFlinger(33): write blocked for 98 msecs, 1619 delayed writes, thread 0xb3f0 
08-22 11:27:34.587: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:46 
08-22 11:27:35.676: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:48 
08-22 11:27:36.796: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:50 
08-22 11:27:37.866: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:51 
08-22 11:27:38.976: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:52 
08-22 11:27:39.556: WARN/AudioFlinger(33): write blocked for 81 msecs, 1660 delayed writes, thread 0xb3f0 
08-22 11:27:40.076: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:53 
08-22 11:27:41.196: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:52 
08-22 11:27:42.326: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:50 
08-22 11:27:43.406: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:48 
08-22 11:27:44.427: DEBUG/MediaPlayerDemo(506): onBufferingUpdate percent:46 
08-22 11:27:44.636: WARN/AudioFlinger(33): write blocked for 86 msecs, 1700 delayed writes, thread 0xb3f0 
08-22 11:27:44.926: DEBUG/MediaPlayerDemo(506): onCompletion called 
08-22 11:27:44.946: WARN/TimedEventQueue(33): Event 627 was not found in the queue, already cancelled? 


+0

에뮬레이터 또는 실제 핸드셋에 있나요? – Kev

+0

나는 그것을 에뮬레이터와 핸드셋 모두에서 테스트했다. –

+0

logcat : '08-20 15 : 32 : 23.122 : DEBUG/MediaPlayerDemo (447) : onBufferingUpdate percent : 37'에있는 내용은 얼마나 오래 지속됩니까? – Kev

답변

1

첫째. 에뮬레이터를 사용하고 있습니까, 아니면 실제 장치입니까?

동영상이 동영상 요구 사항에 맞습니까? 살펴보기 this

아마도 여기에 오류가 있으면 logcat을 포함 시키십시오. 그냥 검은 화면이라고 말하면 도움이되지 않습니다. 비디오 인코딩이 너무 비싸거나 컴퓨터에서 실행되는 에뮬레이터이기 때문에 요구 사항을 충족한다고해도 에뮬레이터가 비디오를 디코딩 할 수 없기 때문에 에뮬레이터에있는 경우 검정 화면을 두 번 경험했습니다.

+0

데이빗 감사합니다. logcat 출력으로 내 질문을 업데이트했습니다. :) –

+0

해결책을 얻었습니다. 안드로이드 에뮬레이터에서 문제가되었지만 실제 장치로 검사했을 때 제대로 작동했습니다. –

1

나는이 문제에 대해 약간의 시간을 보냈다. 그리고 에뮬레이터가 핸드 헬드 장치처럼 전체 화면보기를 트리거하지 않는 설정으로 엉망이되자 마침내 깨달았다. 전체 화면 요청을 한 후 이제 동영상을 볼 수 있습니다.

여기에 좋은 정보가 있습니다 full screen apis

+0

WTF! 모든 사람들이 안드로이드에 대해 말하는 것이 아닌가? 제공된 링크가 Mozilla 워드 프로세서를 가리 킵니다! – Behnam

관련 문제