开发者

Video Screen is not showing in Android

I am using this Java code to play video in Android. But it is showing only black screen.

How might I resolve this?

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");
}
}

My Logcat has -

08-22 11:26:42.566: DEBUG/AndroidRuntime(487): >>>>>>>>>>>>>> AndroidRuntime START  /data/dalvik-cache/data@app@org.apache.android.media-2.apk@classes.dex
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/data@app@org.apache.android.media-1.apk@classes.dex
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_EXPL开发者_高级运维ICIT 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?



I spent a bit of time on this issue, and finally realized after trying to mess with settings that the emulator isn't trigger a full screen view as a handheld device does. After making a fullscreen request, I now see the video.

Here's good info on full screen apis


First of all. Is this using the emulator or on a real device?

Are you sure that the video fits under the video requirements? Take a look at this

Please include a logcat if you see any errors there, as you probably will. Just saying it's a black screen doesn't help us helping you much. I have experienced a couple of black screens when the video encoding is too cpu expensive or if it's on the emulator since the emulator might not be able to decode your video even though it's under the requirements since it's an emulator running on your computer.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜