视频没有在VideoView上显示,但我可以听到它的声音

时间:2013-10-29 05:37:01

标签: android video android-videoview

  • 点击我的按钮后,我编写了以下代码来播放视频 我的 SDCARD(mp4)。

    video_view = (VideoView)findViewById(R.id.video_view);
    video_view.setVideoPath("/sdcard/myvideo.mp4");
    video_view.setMediaController(new MediaController(this));
    video_view.start(); 
    
  • 我可以在播放器中播放SDCARD录制的视频。

  • 但是当我在视频中运行我的应用程序时,我只能听到声音。
  • 问题: 我无法看到该视频。

----我试过跟踪SO链接但仍然没有运气----

  • link 1
  • link 2

  • 有人遇到过这种问题吗?如果是,那怎么解决呢?

12 个答案:

答案 0 :(得分:53)

我已尝试过上述所有方法,但它们都无法正常工作。

最后,我试着调用这个函数,然后出现了视频。

video_view.setZOrderOnTop(true);

希望这也适合你。

答案 1 :(得分:10)

解决方案1:

videoView.setZOrderOnTop(true);

这会将视频视图设置为顶层;换句话说:阻止它下面的一切。

解决方案2:

videoView.setBackgroundColor(Color.TRANSPARENT);

解决方案3:

有时这与你的apptheme有关;在我的情况下,我将apptheme从@style/AppTheme更改为@android:style/Theme.NoTitleBar.Fullscreen以解决我的问题。

答案 2 :(得分:2)

你可以尝试一下吗?

video_view = (VideoView)findViewById(R.id.video_view);
MediaController mediaController = new MediaController(this);
mediaController.setAnchorView(video_view);
mediaController.setMediaPlayer(video_view); //you probably don't need this
video_view.setVideoPath("/sdcard/myvideo.mp4");
video_view.setMediaController(mediaController);
video_view.start(); 

答案 3 :(得分:2)

我遇到了同样的问题,我的视频视图调整为预期的视频分辨率,但屏幕上没有任何内容。我尝试使用上面提到的解决方案但没有任何效果。

我尝试设置可见性并且有效,但不确定原因。这可能有助于遇到此帖并面临像我这样的问题的人

videoView = (VideoView) findViewById(R.id.viewLiveStream);
videoView.setVisibility(View.VISIBLE);

这是我的XML,不确定为什么可见性是一个问题。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/activity_bg1"
    android:orientation="vertical">

    <Button
        android:layout_marginTop="10dp"
        android:layout_gravity="center"
        android:id="@+id/btnStreaming"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/start_streaming" />
    <TextView
        android:layout_marginTop="10dp"
        android:layout_gravity="center"
        android:id="@+id/txtStreamingUrl"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="textMultiLine"
        android:lines="2" />
    <VideoView
        android:id="@+id/viewLiveStream"
        android:layout_width="640dp"
        android:layout_height="480dp"/>
    <Button
        android:id="@+id/btnPlay"
        android:layout_marginTop="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/play"
        android:layout_gravity="center_vertical|center_horizontal"/>
</LinearLayout>
~                                                                                           

答案 4 :(得分:1)

试试这个:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <VideoView 
        android:id="@+id/view"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"/>

</RelativeLayout>

它可能对你有帮助......

答案 5 :(得分:1)

除了我以编程方式添加视频视图外,我遇到了同样的问题。我在检查视图层次结构时注意到,父ViewGroup将其图层类型设置为软件。

由于我处理的代码库是共享的,我没有注意到图层类型正在设置为父ViewGroup的子类中的软件。

因此,请尝试将父视图图层类型设置为“无”或“硬件”

// Remove this if your parent ViewGroup has this set
//setLayerType(View.LAYER_TYPE_SOFTWARE, null);

// Or set this layer type if the above is not present
setLayerType(View.LAYER_TYPE_NONE, null);

答案 6 :(得分:0)

你可以这样做

video_view = (VideoView)findViewById(R.id.video_view);
video_view.setZOrderMediaOverlay(true);
video_view.setVideoPath("/sdcard/myvideo.mp4");
video_view.setMediaController(new MediaController(this));
video_view.start();
video_view.videoView.setZOrderOnTop(true);

在启动videoView后放置setZorderOnTop(true)方法,而不是之前。

答案 7 :(得分:0)

我的解决方案是将VideoView控件置于布局的顶部,无论如何 如果设置了visibility属性。

这适用于使用Android 6.0的S6

答案 8 :(得分:0)

<VideoView android:layout_height="fill_parent"
 android:layout_width="fill_parent"
 android:layout_centerInParent="true" 
android:id="@+id/myVideo"/>


public class Videoplay extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_videoplay);
         VideoView vidView = (VideoView)findViewById(R.id.myVideo);

        MediaController vidControl = new MediaController(this);

        String vidAddress = "https://archive.org/download/ksnn_compilation_master_the_internet/ksnn_compilation_master_the_internet_512kb.mp4";
        Uri vidUri = Uri.parse(vidAddress);

        Toast.makeText(Videoplay.this, "Loading Teaser",Toast.LENGTH_LONG).show();
        vidView.setVideoURI(vidUri);
          vidView.start();   
        vidControl.setAnchorView(vidView);

        vidView.setMediaController(vidControl);


    }

我在这里播放其中一个链接的视频.. 它对我来说很完美。

希望这会有所帮助..

答案 9 :(得分:0)

当我没有释放MediaPlayer对象时,黑屏和音频播放就发生了。当您使用媒体播放器在“活动”中播放视频时,必须在活动被销毁时将其释放。并且当您再次打开它时,将创建一个新的媒体播放器实例,并使用已经释放的资源。

MediaPlayer.release();

答案 10 :(得分:0)

我尝试了以上所有答案,但是在观察一些代码后没有成功,我要求将焦点放在我的视频视图上。 而且它现在可以在所有设备上使用, 希望这对某些开发者有用!

private var mediaController: MediaController? = null
private fun prepareVideo() {
    val uri = Uri.fromFile(File(recordedVideoPath))
    mediaController = MediaController(this)
    mediaController?.setAnchorView(videoView)
    videoView.setMediaController(mediaController)
    videoView.requestFocus()
    videoView.setVideoURI(uri)
    videoView.seekTo(2)
    videoView.setZOrderOnTop(true)

    videoView.setOnPreparedListener {
        try {
            mediaController?.show(0)
        } catch (e: Exception) {
            System.out.println("Error in Video")
        }
    }
    videoView.setOnErrorListener { _, _, _ ->
        true
    }
}

答案 11 :(得分:-7)

我认为你使用了糟糕的mp4格式。使用Android特定的mp4格式!!!