Android:MediaPlayer 视频宽高比问题

2024-02-14

我遇到一个无法解决的问题。我正在使用 MediaPlayer 类来播放视频;但是,我总是失去原始的纵横比。这里提到了媒体播放器代码和xml代码。我已经尝试了很多方法但仍然无法解决问题。我需要保持原始的宽高比。我已在 Android 清单文件中声明此活动为全屏。我还在媒体播放器代码之后附加了 xml 代码。请建议我。

private class ErrorListener implements OnErrorListener {
    // FIXME: @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        String message = "Unknown error";
        switch (what) {
        case MediaPlayer.MEDIA_ERROR_UNKNOWN:
            message = "Unable to play media";
            showError(message);
            break;
        case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
            message = "Server failed";
            showError(message);
            break;
        case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
            message = "Invalid media";
            showError(message);
            break;
        }
        return false;
    }
}

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    setContentView(R.layout.videoview);
    Intent intent = getIntent();
    uri = intent.getData();
    new loadMovie().execute();
    mPreview = (SurfaceView) findViewById(R.id.videoview);
    mPreview.bringToFront();
    holder = mPreview.getHolder();
    holder.addCallback(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    mediaPlayer = new MediaPlayer();

}// onCreate Method Ends

private void playVideo() {
    doCleanUp();
    try {
        mediaPlayer.setDataSource(this, uri);
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    mediaPlayer.setDisplay(holder);
    try {
        mediaPlayer.prepare();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    mediaPlayer.setOnErrorListener(new ErrorListener());
    mediaPlayer.setOnBufferingUpdateListener(this);
    mediaPlayer.setOnCompletionListener(this);
    mediaPlayer.setOnPreparedListener(this);
    mediaPlayer.setOnVideoSizeChangedListener(this);
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    mediaController = new MediaController(this);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    mediaController.show();
    return false;
}

// --MediaPlayerControl
// methods----------------------------------------------------
public void start() {
    mediaPlayer.start();
}

public void pause() {
    mediaPlayer.pause();
}

public int getDuration() {
    return mediaPlayer.getDuration();
}

public int getCurrentPosition() {
    return mediaPlayer.getCurrentPosition();
}

public void seekTo(int i) {
    mediaPlayer.seekTo(i);
}

public boolean isPlaying() {
    return mediaPlayer.isPlaying();
}

public int getBufferPercentage() {
    return 0;
}

public boolean canPause() {
    return true;
}

public boolean canSeekBackward() {
    return true;
}

public boolean canSeekForward() {
    return true;
}

// End of MediaPlayer
// Controls--------------------------------------------------------
// ------------------------

public void onPrepared(MediaPlayer mediaPlayer) {
    mediaController.setMediaPlayer(this);
    mediaController.setAnchorView(findViewById(R.id.videoview));
    mIsVideoReadyToBePlayed = true;

    if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
        startVideoPlayback();
    }

    handler.post(new Runnable() {
        public void run() {
            mediaController.setEnabled(true);
            mediaController.show();
        }
    });
}

public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
    // TODO Auto-generated method stub

}

public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    playVideo();
}

public void surfaceDestroyed(SurfaceHolder arg0) {

}

private void startVideoPlayback() {
    holder.setFixedSize(mVideoWidth, mVideoHeight);
    mediaPlayer.start();
}

public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
    if (width == 0 || height == 0) {
        return;
    }
    mIsVideoSizeKnown = true;
    mVideoWidth = width;
    mVideoHeight = height;
    if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
        startVideoPlayback();
    }

}

public void onCompletion(MediaPlayer arg0) {

}

public void onBufferingUpdate(MediaPlayer mp, int percent) {

}

private void releaseMediaPlayer() {
    mediaPlayer.release();
    mediaPlayer = null;
}

private void doCleanUp() {
    mVideoWidth = 0;
    mVideoHeight = 0;
    mIsVideoReadyToBePlayed = false;
    mIsVideoSizeKnown = false;
}

这是 XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
>
<SurfaceView android:id="@+id/videoview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />
 </LinearLayout>

谁能告诉我如何保持视频的宽高比?


首先使用 Gravity.CENTER 创建一个相对布局,并将 Surface 视图附加到其中。这将确保视频位于屏幕中央。

另外,如果您正在使用活动,请使用“黑色”主题以避免渐变

在 SurfaceView 中,创建一个侦听器:

mMediaPlayer = new MediaPlayer();

...

MediaPlayer.OnVideoSizeChangedListener mOnVideoSizeChangedListener = new MediaPlayer.OnVideoSizeChangedListener() {

    @Override
    public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {

         setFitToFillAspectRatio(mp, width, height);

    }
};
mMediaPlayer.setOnVideoSizeChangedListener(mOnVideoSizeChangedListener);

...

最后是 SurfaceView 中的 fit to fill 方法。这适用于横向和纵向

private void setFitToFillAspectRatio(MediaPlayer mp, int videoWidth, int videoHeight)
{
    if(mp != null)
    {       
        Integer screenWidth = ((Activity) mContext).getWindowManager().getDefaultDisplay().getWidth();
        Integer screenHeight = ((Activity) mContext).getWindowManager().getDefaultDisplay().getHeight();
        android.view.ViewGroup.LayoutParams videoParams = getLayoutParams();


        if (videoWidth > videoHeight)
        {
            videoParams.width = screenWidth;
            videoParams.height = screenWidth * videoHeight / videoWidth;
        }
        else
        {
            videoParams.width = screenHeight * videoWidth / videoHeight;
            videoParams.height = screenHeight;
        }


        setLayoutParams(videoParams);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:MediaPlayer 视频宽高比问题 的相关文章

  • getItem 与 getItemAtPosition

    有两种方法可以获取列表视图中的选定项目 list getAdapter getItem position list getItemAtPosition position 我的问题是 哪一种是首选的做法 我见过人们同时使用这两种方法 您可以使
  • 检测到设备正在振动?

    我使用下面的代码来振动设备 public void vibrator try Vibrator vibrator Vibrator getSystemService Context VIBRATOR SERVICE vibrator vib
  • Android 应用程序在后台运行时保存数据

    目前我正在开发 xmmp 客户端 当应用程序位于前台时 该客户端工作得很好 但由于事实上 当应用程序处于后台时 我在 Application 类中保存了大量数据 复杂的 ArrayList 字符串和布尔值作为公共静态 每个字段都被垃圾收集
  • 导航组件重复 NavArgs 的问题

    我有一个片段 class SomeFragment private val args by navArgs
  • Firebase Analytics 禁用受众国家/地区跟踪

    我正在开发一个严格不允许位置跟踪的应用程序 我想使用 Firebase Analytic 的其他功能 例如 PageTransitions 和 Crashalitics 但如果我无法禁用受众位置跟踪 我就无法使用其中任何功能 这是我在 An
  • Phonegap - 如何将.txt文件保存在Android手机的根目录中

    我正在尝试使用phonegap 将 txt 文件保存在Android 手机的根目录中 我已经安装了这些插件 cordova plugin file 和 cordova plugin file transfer 在 config xml 文件
  • 接近语法错误(代码1)插入Android SQLite

    我正在创建一个通讯录应用程序 用户可以在其中输入姓名 电子邮件地址和号码 我希望将此数据保存在数据库中 但我似乎无法使插入方法起作用 我收到的错误是 android database sqlite SQLiteException near
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • 在意图过滤器中使用多个操作时的默认值

    尝试理解 Android 中的意图和操作并查看文档 http developer android com guide topics intents intents filters html 但我一直看到的一件事是定义了多个操作的意图过滤器
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • 已经使用 AsyncTask doInBackground 但新数据未显示

    我使用 AsyncTask 创建一个聊天室来接收消息 因此它总是检查即将到来的消息并将其显示给客户端 但代码似乎无法按我希望的方式工作 在客户端只显示所有旧数据 新数据不显示 因为当我尝试从服务器发送消息时 新数据没有显示在客户端中 我对这
  • 在我的Android中,当其他应用程序想要录制音频时如何停止录音?

    在我的应用程序中 服务通过 AudioRecord 持续录制音频 当我的应用程序运行时 其他与音频记录相关的应用程序 例如 Google 搜索 无法工作 如何知道何时有其他应用想要录制音频 以便我可以停止录制以释放资源 答案是MediaRe
  • 更新到材质 1.2.0 后,材质按钮上缺少圆角半径属性

    这是我的材质按钮代码
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • 使用 Matrix.setPolyToPoly 选择位图上具有 4 个点的区域

    我正在 Android 上使用位图 在使用 4 个点选择位图上的区域时遇到问题 并非所有 4 点组都适合我 在某些情况下 结果只是一个空白位图 而不是裁剪后的位图 如图所示 并且 logcat 中没有任何错误 甚至是内存错误 这是我用来进行
  • Android Studio:无法启动守护进程

    当我尝试在 Android Studio 中导入 gradle 项目时 遇到以下错误 Unable to start the daemon process This problem might be caused by incorrect
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • 在webview android中加载本地html文件

    我正在尝试在 android 的 webview 中加载 html 文件的内容 但是 它给了我 网页不可用错误 如果我尝试使用谷歌或雅虎等网站 它们就会起作用 html文件位于src gt main gt assests gt index
  • 如何将图像从 Android 应用程序上传到网络服务器的特定文件夹中

    如何将图像从 android 移动到 Web 服务器上的指定文件夹 这是我的安卓代码 package com example bitmaptest import java io ByteArrayOutputStream import ja
  • 为什么Android的ImageReader类这么慢?

    我尝试了适用于 Android 3 4 1 的全新 OpenCVJavaCamera2View但它太慢了 仅显示相机视图约 15 fps 当我尝试较旧的JavaCameraView相反 它给了我很好的结果 30fps 这是我相机的极限 我想

随机推荐

  • PHP 帖子名称通配符 - $_POST['var_'.*];

    是否可以使用某种通配符来创建以特定字符串开头的 POST 变量 本质上 我试图捕获任何包含 bSortable wildcard 作为名称的 POST bSortable 1 bSortable 2 bSortable 3 我正在为 jqu
  • 如何从向量创建元组?

    下面是一个示例 它分割字符串并解析每个项目 将其放入一个其大小在编译时已知的元组中 use std str FromStr fn main let some str 123 321 312 let num pair str some str
  • 如何解决 em_mysql2 的“连接仍在等待结果”错误

    我在 Goliath eventmachine 下将 activerecord 与 em mysql2 一起使用 最奇怪的事情发生在我的用户模型上 当我第一次向 users 发送 POST 时 一切正常 按预期查找 当我执行第二次 POST
  • 可以将 ASP.NET 编译为机器代码吗?

    是否可以将 ASP NET Web 应用程序编译为机器语言 如果是这样 有任何性能优势吗 是的你可以 NGen exe http msdn microsoft com en us library 6t9t5wcf aspx 这是一个 Sta
  • window.onbeforeunload 和 window.onunload 在 Firefox、Safari、Opera 中不起作用?

    在我的聊天应用程序中 当我的应用程序关闭时 我需要得到用户的确认 所以我用了window onbeforeunload用于确认警报和window onunload for logout 但这两个功能都可以在 IE 和 Chrome 中使用
  • 有什么方法可以返回对函数中创建的变量的引用吗?

    我想编写一个程序 分两步写入一个文件 在程序运行之前该文件可能不存在 文件名是固定的 问题是OpenOptions new write 可能会失败 在这种情况下 我想调用自定义函数trycreate 这个想法是创建文件而不是打开它并返回句柄
  • C 逗号运算符的使用[重复]

    这个问题在这里已经有答案了 您会看到它在 for 循环语句中使用 但它在任何地方都是合法的语法 您在其他地方发现了它的哪些用途 如果有的话 C 语言 以及 C 历史上是两种完全不同的编程风格的混合体 可以称为 语句编程 和 表达式编程 如您
  • JQuery JSONP 跨域调用不执行任何操作

    每当我通过 jquery 对我设置的任何页面 本地或服务器上 进行 JSONP 调用时 我得到的只是静默处理 Firebug 报告 200 OK 并且响应看起来没问题 我设置了成功时弹出的警报框 或者 失败但两者都没有出现 似乎无论我使用什
  • 使用 .Net 验证路径相等性

    比较 Net 中的两个路径以确定它们是否指向同一文件或目录的最佳方法是什么 如何验证它们是否相同 c Some Dir SOME FILE XXX C SOME DIR some file xxx 更好的是 有没有办法验证这些路径是否指向某
  • jQuery 动态 qtip 显示 div,但每次鼠标悬停都会变得越来越慢

    我使用 jQuery qTip 插件来显示鼠标悬停链接 img 的 div 我写了两个选项来使用 但这两个选项都造成了麻烦 V1 第一个版本仅在我第二次将鼠标移到链接上时才显示工具提示 重复将鼠标悬停在链接上后 脚本似乎变得越来越慢 6 7
  • php unlink() 非ascii字符=找不到文件[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 简短 php unlink 正在处理名称为 asci 的文件 但是 如果我尝试删除名称包括 等的文件 则会出现取消链接生
  • 无法使用ajax从数据库获取数据

    我正在开发 ASP Net MVC 应用程序 我想使用ajax从数据库获取数据 它不会在网页中加载数据 控制台窗口上也没有错误 在 Visual Studio 中也不例外 以下是我的控制器代码 HttpGet public JsonResu
  • 如何使用 HTML 进行 Skype 通话?

    我尝试在我的脚本中插入以下代码片段 通过单击该链接 它应该会呼叫 Skype 帐户 我已经找了好几个小时了 但不明白为什么它不起作用 pre code lt a href quot callTo USERNAME quot gt lt im
  • 市场上的 Github Actions 可以做恶意的事情吗?

    我是 GitHub Actions 的绝对初学者 市场上有可用的操作 这些操作是否可以对我的存储库进行恶意操作 例如 删除我的仓库 将恶意代码提交到我的存储库中 从私人存储库复制内容 答案是 不幸的是 YES 您可以在这里找到一些参考 使用
  • 使用PHPExcel制作自动生成excel文件

    我想让我的 Excel 文件填充从数据库中获取的一些数据 例如某人的姓名和年龄 假设我的数据库中有 10 个人 我希望将这 10 个人包含在我的 Excel 文件中 所以基本上 你会得到 姓名年龄 人1 20岁 人2 25岁 等等 我知道如
  • JavaScript 函数返回 TYPE BOOLEAN 的变量名称,而不是模板文字中的值本身 [重复]

    这个问题在这里已经有答案了 javascript 中是否有一个函数 我可以将变量 而不是值 设置为像 parseVariableName 这样的字符串 例如 在我的场景中 我想要使用布尔变量有一个 动态类名不创建对象 将其作为数组并循环 我
  • 回形针不保存附件

    我是 Rails 和 Web 开发领域的新手 我已经创建了一个用户模型 现在我正在尝试让用户能够使用回形针添加个人资料图片 在我的用户显示页面中 用户可以单击链接打开 编辑 页面 从中可以看到要浏览的表单并选择要上传的图像 单击按钮时 它会
  • 从数据库读取和显示时,“应用程序启动方法中出现异常,java.lang.reflect.InitationTargetException”

    我正在尝试从 MySQL 数据库读取值并将其显示在 JavaFX 的表中 我使用netbeans IDE 当我运行代码时 我得到了标题中提到的异常 我将在下面发布代码 public class ViewSubject extends App
  • 使用 data.table R 选择行或列?

    假设我有一个 data table 例如 library data table RRR lt data table 1 15 runif 15 rgeom 15 0 5 rbinom 15 2 0 5 V1 V2 V3 V4 1 1 0 3
  • Android:MediaPlayer 视频宽高比问题

    我遇到一个无法解决的问题 我正在使用 MediaPlayer 类来播放视频 但是 我总是失去原始的纵横比 这里提到了媒体播放器代码和xml代码 我已经尝试了很多方法但仍然无法解决问题 我需要保持原始的宽高比 我已在 Android 清单文件