【问题标题】:android video, hear sound but no videoandroid视频,听到声音但没有视频
【发布时间】:2011-01-12 03:57:44
【问题描述】:

我尝试了几个不同的示例,但无法播放任何视频。我听到声音但没有视频。我想也许我只是有一个不正确的视频格式,所以我下载了一个 3gp 格式的法定商业广告,但仍然没有乐趣。我正在使用带有 android sdk 的 Eclipse Java EE,我的应用程序针对 1.5 sdk(Api Level 3)而没有 google api。有人可以发布一个已知可以在 android 中播放的视频的链接,或者指出我的代码问题。我已经尝试了所有我能想到的......有/没有准备..不同的布局等。

这是我在活动中的 onCreate

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

this.setContentView(R.layout.video_test);
    SurfaceView v = (SurfaceView) findViewById(R.id.surface_video); 
    SurfaceHolder holder = v.getHolder(); 
 // Set the transparency 
    //getWindow().setFormat(PixelFormat.UNKNOWN); 


    // Set a size for the video screen 
    //holder.addCallback(this); 
    holder.setFixedSize(400,300); 


    MediaPlayer mp = MediaPlayer.create(this, R.raw.fiat); 
    mp.setDisplay(holder);
    //mp.setAudioStreamType(2); 
    try {
        //mp.prepare();
        mp.start();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

她是video_test.xml中的布局

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<SurfaceView android:id="@+id/surface_video" 
android:layout_width="250px" 
android:layout_height="250px"> 
</SurfaceView> 
<LinearLayout 
android:orientation="horizontal" 
android:layout_height="wrap_content" 
android:layout_width="fill_parent" 
android:padding="10dip" 
> 
</LinearLayout> 
</LinearLayout> 

>块引用

【问题讨论】:

  • 我在使用 VideoView 时也遇到了这个问题,但是如果我在视频开始后请求焦点,那么它可以正常工作。

标签: android video media-player surfaceview


【解决方案1】:

给定的视频文件是否会在给定的播放器中播放取决于三件事:

  • 视频容器格式(文件类型)。
  • 视频(可能还有音频)流编码的编解码器; 您的播放器对容器格式和编解码器组合的支持
  • 几乎可以肯定,它的编解码器和播放器/设备支持是导致您看到的结果不一致的原因。 (如果您不知道,编解码器基本上是一个可重复的数学公式,它告诉您的系统如何将打包到文件中的位和字节转换为动态图片(就此而言,再返回))

【讨论】:

    【解决方案2】:

    这是一个老问题,但我的回答可能会对某人有所帮助。

    要支持旧版本的 Android,您需要添加以下行:

    videoHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    

    【讨论】:

      【解决方案3】:

      你的类必须实现 SurfaceHolder.Callback 并调用 setDisplay、prepare 等方法,只有在你进入 SurfaceCreated 之后。此外,您可能需要将表面支架的类型更改为 SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS。像这样:

      import android.view.SurfaceHolder.Callback;
      
      public class TestActivity extends Activity implements Callback {
      
      // ...
      
          @Override
          public void onCreate(Bundle savedInstanceState) {
              // ...
              mSurfaceView = (SurfaceView)findViewById(R.id.yousurfaceview); 
              holder = mSurfaceView.getHolder();
              holder.addCallback(this);
              holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
          }
      
      @Override
      public void surfaceCreated(SurfaceHolder holder) {
          try {
              mp.setDisplay(holder);
              mp.setDataSource(somesource);
              mp.prepare();
              mp.start();
              // etc...
          } catch (IOException e) {
              } catch (IllegalArgumentException e) {
              } catch (IllegalStateException e) {
          }
      
      }
      
      // ...
      }
      

      如果您在 OnCreate 中尝试,您将一无所获,因为 Surface 尚未创建...

      【讨论】:

      • 非常爱你。你救了我的命!我对您的答案进行了一些修改
      • 非常感谢SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS!极好的!恭喜您获得金色徽章 - 这是当之无愧的!
      • 来自官方文档:此常量在 API 级别 11 中已弃用。忽略此值,需要时自动设置此值。
      【解决方案4】:

      我遇到了同样的问题。我可以通过在 XML 布局文件中将 SurfaceView 更改为 VideoView 来修复它。保持所有其余代码相同。这对我有用,不知道为什么。

      【讨论】:

        【解决方案5】:

        您可以通过查看 Android ApiDemo 示例应用程序获得完整示例(查看“媒体”下的示例):http://developer.android.com/resources/samples/ApiDemos/index.html

        至于与演示一起使用的示例电影,我已经成功使用了 YouTube 移动网站的链接。

        【讨论】:

          【解决方案6】:

          如果您使用的是模拟器,它可能无法正常工作。模拟器缺乏 Android 设备中可用的硬件加速。例如,在 2.6GHz Core 2 Duo 上,我有时可以播放视频,但并非总是如此。在较慢的机器上,视频播放永远无法正常工作。在 2.5GHz Core 2 Quad 上,我总是可以播放视频。话虽如此,我通常在实际设备上测试视频播放。

          我也不确定视频播放是否可以使用原始资源。我强烈建议您先尝试使用 SD 卡上文件中的视频。

          关于绝对有效的视频,我知道来自here 的“纪录片和你”和“我们的孙子的音乐”以 MP4 形式播放。

          【讨论】:

          • 我使用的是 core 2 duo 3.0 ghz。我不知道为什么,但我在这个论坛上发现了另一个使用 VideoView 的相同内容。感谢您的回答.. 我不知道它依赖于 cpu 这里是链接到对我有用的东西stackoverflow.com/questions/2167608/…
          • 这个答案是不真实的。在他的情况下,视频播放不起作用,因为他没有在 SurfaceHolder 上初始化回调......这与模拟器或计算机速度没有任何关系。请参阅底部的答案以及正确初始化 SurfaceHolder 的代码。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多