在 Android 上准备媒体记录器时出现延迟

2023-12-29

我正在 10 秒内录制多个小视频。在创建任何视频之前,我需要一次又一次地准备和启动媒体录制器。因此,每个视频都有一两秒的时间滞后。 在准备像 Instagram 这样的媒体记录器时,有什么方法可以避免这种时间延迟吗?

public boolean startRecording() {

    startCamera();
    camera.unlock();

    int rotation = 0;
    cameraInfo = new CameraInfo();
    Camera.getCameraInfo(cameraId, cameraInfo);
    if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
        rotation = 270;
    } else {
        rotation = 90;
    }

    mMediaRecorder = new MediaRecorder();
    mMediaRecorder.setOrientationHint(rotation);
    mMediaRecorder.setCamera(camera);
    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mMediaRecorder.setVideoFrameRate(30); 
    mMediaRecorder.setVideoEncodingBitRate(1500000);
    mMediaRecorder.setVideoSize(640, 480);
    File f = new File(cVideoFilePath);
            int countNames = 1;
    String[] fileNameList = null;
    fileNameList = f.list();
    for (int i = 0; i < fileNameList.length; i++) {

        if (fileNameList[i].contains("TapVid")) {
            countNames++;
        }

    }

    updatedFileNumber = countNames;
    prRecordedFile = new File(cVideoFilePath + "Vid" + updatedFileNumber
            + ".mp4");
    mMediaRecorder.setOutputFile(prRecordedFile.getPath());

    mMediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());

    try {
        mMediaRecorder.prepare();

        mMediaRecorder.start();
    } catch (Exception e) {
        e.printStackTrace();
        releaseMediaRecorder();
        return false;
    }


    return true;
}

因此 Instagram 也遭受了 MediaRecorder 延迟的困扰。您可以判断何时进行快速点击。进度条重置。只有当您按住录制按钮超过一秒时,它才会真正捕获任何内容。

这只是 MediaRecorder 的固有缺陷。解决这个问题的唯一方法是使用 setPreviewCallbackWithBuffer API。在使用此 API 时,您为相机提供缓冲区来显示预览,并且它会向您回调在预览表面上显示的 YUV 帧。然后,您可以将此缓冲区传递给 MediaCodec 对视频进行编码。

理想情况下,OEM 已实现 MediaCodec 来了解从相机传递的缓冲区,但我们在 4.3 之前的许多设备上看到了不稳定的性能。例如,随机 MediaCodec 实现期望与相机提供的对齐方式和 YUV 格式不同。您还必须自己捕获音频并保持 AV 同步。

或者,您可以将缓冲区传递给 ffmpeg 进行编码 - 只是要小心您在 ffmpeg 中构建的编解码器。 VP8 + vorbis 是我们见过的性能最好的免版税编解码器。

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

在 Android 上准备媒体记录器时出现延迟 的相关文章

随机推荐

  • 如何将 javascript 变量的值赋给 php 变量

    我有一个表格
  • postgres:复合全文/btree 索引

    我想对一列进行全文搜索并在另一列中进行排序 如果我分别为这两列建立索引 postgres 就不能在此查询中使用这两个索引 有没有办法创建可以在这种情况下使用的复合索引 不幸的是没有 虽然您可以通过以下方式将标量列附加到 GIN 索引btre
  • 求numpy中n个点到m个点之间的平方距离

    我有 2 个 numpy 数组 比如说X and Y 其中每一行代表一个点向量 我想找到 X 中每个点到 Y 中每个点之间的平方欧氏距离 将称为 距离 我希望输出是矩阵 D 其中D i j is dist X i Y j 我有以下基于以下
  • 当传播设置为 Propagation.NOT_SUPPORTED 时 Hibernate 和 TransactionRequiredException

    TL DR 服务方法注释为 Transactional propagation Propagation NOT SUPPORTED Hibernate 5 0 4 Final 一切按预期工作 方法在没有事务的情况下执行 休眠 5 2 5 最
  • 存储变量数据

    我正在使用 ASP NET C MVC3 和 SQL Server 2008 构建一个应用程序 向用户提供一个表格供其填写 姓名 电子邮件 地址等 我希望允许应用程序管理员在此表单中添加额外的动态问题 额外问题的数量和返回的数据类型会有所不
  • Laravel Dusk,DatabaseTransactions 不执行回滚

    我正在使用 Laravel Dusk 以下注册测试工作正常 只是它不会回滚事务 即在 注册 上创建的用户记录始终保留在数据库中 我的表都设置为使用 InnoDB 引擎 对发生的事情有什么想法吗 我在很多地方都放了日志 看起来没有什么特别错误
  • 从专用网卡访问时,Rails 显示 IP 为 127.0.0.1,但 Nginx 显示正确的 IP。公共 IP 转发良好

    我们正在 Unicorn Nginx 上运行 Rails 应用程序 服务器有两个我们使用的网卡 eth0处理公共互联网的请求 以及eth2处理来自我们专用网络的请求 当请求通过时eth0 nginx日志显示公共IP Rails日志也显示此I
  • 在 xcode 中添加另一个团队

    这个问题不是重复的在 xcode 中添加另一个团队 https stackoverflow com questions 32610740 adding another team to xcode or 受邀加入开发团队时如何从 Xcode
  • 如何在 C# 中复制类的实例

    C 有没有办法复制对象 就像是 var dupe MyClass original 我希望它们相等 以便所有数据成员都相同 但不共享相同的内存位置 您可能正在谈论深层复制 深拷贝与浅拷贝 https stackoverflow com qu
  • 一次自动静音播放多个 YouTube 视频

    我正在尝试制作一个使用 YouTube iframe API 来显示多个视频的网页 这些视频在加载时自动开始播放 我希望 4 个视频中的 3 个开始静音播放 但第 4 个视频有音频播放 最后 我尝试创建一个静音 取消静音和暂停 开始按钮 让
  • JSON 数据未显示,而是显示空白屏幕

    尝试制作一个简单的应用程序 从服务器获取 JSON 数据并将它们显示在自定义列表中 这是非常简单的事情 但是当我运行该应用程序时 它显示白色空白屏幕 但没有数据 它也没有显示任何错误 我假设如果有任何错误它就不会在我的手机中运行 但不显示获
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • csv 到 xml:不确定在 Mule ESB 中执行此操作的最佳方法

    我是 Mule 的新手 所以请耐心等待 我收到以下 CSV 文件 Company1 2 123 Street Winchester UK 000010 CHRISTINE I HAAS A00 3978 1995 01 01 PRES 18
  • Java - 在不同的进程中启动另一个类的main

    我需要一种干净的方法来使用 GUI 启动 Java 程序的许多实例 并且我想以编程方式执行此操作 我想要运行的 程序 只是一个 class 文件 带有 main 方法的已编译的 java 文件 它应该显示一个 GUI 并独立于其他文件运行
  • Laravel Eloquent - 如果列值为 NULL 或 0,则不运行关系查询

    我的内部有各种各样的关系Eloquent Models看起来像这样 public function main image return this gt hasOne Media class id main image id 然而 如果mai
  • 创建行并将其写入文件

    是否可以创建一个文件并在 vbscript 中向其中写入行 类似的东西蝙蝠中的回声 file echo something something gt gt sometextfile txt 执行 vbscript 时 根据脚本的路径将创建一
  • 通过 debconf-set-selections 为 mysql 预配置一个空密码

    我正在设置一个 bash 脚本来自动构建 LAMP 环境 我在用debconf set selections在安装 mysql phpmyadmin 等之前设置选项 主要是效果很好 但问题是我have to为 mysql 设置一个空密码 即
  • 如何知道给定用户是否已使用 MSAL 登录?

    使用 msal js 库 Microsoft 身份验证库 这是了解给定用户是否已登录的方法 我的目的是避免在用户的凭据已保存在浏览器存储中时显示登录弹出窗口 我目前的做法 function isUserLoggedIn username c
  • PreparedStatement 上的 ArrayOutOfBoundsException

    我在这里不知所措 有人能看出这段代码有什么问题吗 我将 sqlite 与此驱动程序一起使用 https bitbucket org xerial sqlite jdbc downloads https bitbucket org xeria
  • 在 Android 上准备媒体记录器时出现延迟

    我正在 10 秒内录制多个小视频 在创建任何视频之前 我需要一次又一次地准备和启动媒体录制器 因此 每个视频都有一两秒的时间滞后 在准备像 Instagram 这样的媒体记录器时 有什么方法可以避免这种时间延迟吗 public boolea