将图像序列转换为视频文件 android java

2024-01-16

我知道这是一个老问题,我对此进行了很多研究,但似乎没有适当的解决方案。我已经看到了一些方法可以做到这一点,例如:

  • 使用 FFmpeg (但它取决于本机代码,所以对我来说不是一个选择)

  • Xuggler API(与上面的原因相同)

我正在寻找可以将多个图像(可绘制或位图或其他任何图像)转换为可以在 Android 手机中播放的视频文件的解决方案甚至建议。我已经被这个问题困了三天了,急于寻找解决方案。

我还在寻找解决我的问题的替代解决方案,不是将图像转换为视频,是否可以捕获和记录 Android 手机屏幕,实际上是我的应用程序中的屏幕? (请不要使用 USB 电缆插入计算机或类似的东西。我在研究时看到了很多这样的东西,这不是我要找的)。

任何帮助将不胜感激,并对我的英语感到抱歉,这不是我的母语。


您可以使用名为 JCodec 的纯 java 开源库(http://jcodec.org http://jcodec.org),下面的类演示了使用 JCodec 低级 API 将图像序列转换为 MP4 剪辑 ( H.264 ):

public class SequenceEncoder {
    private SeekableByteChannel ch;
    private Picture toEncode;
    private RgbToYuv420 transform;
    private H264Encoder encoder;
    private ArrayList<ByteBuffer> spsList;
    private ArrayList<ByteBuffer> ppsList;
    private CompressedTrack outTrack;
    private ByteBuffer _out;
    private int frameNo;
    private MP4Muxer muxer;

    public SequenceEncoder(File out) throws IOException {
        this.ch = NIOUtils.writableFileChannel(out);

        // Transform to convert between RGB and YUV
        transform = new RgbToYuv420(0, 0);

        // Muxer that will store the encoded frames
        muxer = new MP4Muxer(ch, Brand.MP4);

        // Add video track to muxer
        outTrack = muxer.addTrackForCompressed(TrackType.VIDEO, 25);

        // Allocate a buffer big enough to hold output frames
        _out = ByteBuffer.allocate(1920 * 1080 * 6);

        // Create an instance of encoder
        encoder = new H264Encoder();

        // Encoder extra data ( SPS, PPS ) to be stored in a special place of
        // MP4
        spsList = new ArrayList<ByteBuffer>();
        ppsList = new ArrayList<ByteBuffer>();

    }

    public void encodeImage(BufferedImage bi) throws IOException {
        if (toEncode == null) {
            toEncode = Picture.create(bi.getWidth(), bi.getHeight(), ColorSpace.YUV420);
        }

        // Perform conversion
        for (int i = 0; i < 3; i++)
            Arrays.fill(toEncode.getData()[i], 0);
        transform.transform(AWTUtil.fromBufferedImage(bi), toEncode);

        // Encode image into H.264 frame, the result is stored in '_out' buffer
        _out.clear();
        ByteBuffer result = encoder.encodeFrame(_out, toEncode);

        // Based on the frame above form correct MP4 packet
        spsList.clear();
        ppsList.clear();
        H264Utils.encodeMOVPacket(result, spsList, ppsList);

        // Add packet to video track
        outTrack.addFrame(new MP4Packet(result, frameNo, 25, 1, frameNo, true, null, frameNo, 0));

        frameNo++;
    }

    public void finish() throws IOException {
        // Push saved SPS/PPS to a special storage in MP4
        outTrack.addSampleEntry(H264Utils.createMOVSampleEntry(spsList, ppsList));

        // Write MP4 header and finalize recording
        muxer.writeHeader();
        NIOUtils.closeQuietly(ch);
    }
}

然后你可以像这样使用它:

public static void main(String[] args) throws IOException {
    SequenceEncoder encoder = new SequenceEncoder(new File("video.mp4"));
    for (int i = 1; i < 100; i++) {
        BufferedImage bi = ImageIO.read(new File(String.format("img%08d.png", i)));
        encoder.encodeImage(bi);
    }
    encoder.finish();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将图像序列转换为视频文件 android java 的相关文章

随机推荐

  • 必填字段验证器,在初始页面加载时显示

    我有一个简单的文本框 末尾附加了必需的字段验证控件 然后显示在页面底部的验证摘要中 一切都运行良好 但验证似乎在页面的初始加载时触发 这显然会引发所需的验证并显示错误消息 如何将此控件设置为仅在提交表单后才验证 听起来您的页面加载中有这样的
  • 将 sql 查询转换为等效的 Spark 查询

    我在用spark sql 2 4 1v用java8 我有如下所示的场景 片段 Dataset
  • Android中AAR、JAR、DEX、APK的区别

    在Android系统或开发环境中 AAR JAR DEX APK文件有什么区别 每一项的目的是什么 AFAIK JAR 就像 class 文件的集合 就像 Java 中的那样 AAR 是 JAR 文件 资源 但它的用例是什么 用于分发 An
  • 为什么在 scala Spark 应用程序中初始化 SQLContext 后导入隐式 SqlContext.implicits._

    为什么在 scala Spark 应用程序中初始化 SQLContext 后导入隐式 SqlContext implicits 当导入放在对象之外时 似乎存在问题 我来自 java 背景 不理解 def 对象中 import 语句的用法 v
  • HTTPS 通信是否需要 JWT?

    我正在开发一个 MEAN 堆栈应用程序 目前正在设置一个帐户系统 我看过几个关于身份验证的教程 全部使用JWT 我想知道 JWT 是否可以用作通过非安全连接 如 HTTP 来保护通信传输的方法 我已经设置了 HTTPS 从 Angular
  • Android 通知管理器在屏幕关闭时不起作用

    我有一个倒计时器 当它关闭 到零 时 它会检查应用程序是否具有焦点 如果没有 它会在通知栏中启动通知 当您单击通知时 将重新打开应用程序 现在所有这些都工作正常 但如果屏幕碰巧关闭 计时器会继续运行 并且通知会在正确的时间可用 但在我重新打
  • 如何识别 Teradata 用户的所有权限?

    我正在寻找一种方法来识别授予特定数据库中用户的默认权限 我已经尝试过这个 select from dbc allrights where username user id and databasename database name 上述有
  • 像地址栏一样的资源管理器窗口[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 以与创建相反的顺序处理对象?

    我在编写的代码中遇到一个反复出现的问题 修改某些全局值 我将使用注册表值作为示例 然后尝试将修改恢复到原始状态 我想我会尝试使用 IDisposable 来解决这个问题 创建时 该对象将读取注册表值 将其存储在本地 然后对其进行修改 当被破
  • 以编程方式配置 Eclipse 安装的 JRE

    我想将 Eclipse 环境配置为使用 JDK 而不是标准 JRE 我这样做是因为我使用 m2eclipse 它需要 JDK 中的 tools jar 才能运行 我在 Windows 7 32 位和 JDK 1 6 0 16 上运行 Ecl
  • clang format 可以格式化 C/C++ 函数以在逗号之前打破参数列表吗?

    我注意到你可以做到这一点 From https clang llvm org docs ClangFormatStyleOptions html https clang llvm org docs ClangFormatStyleOptio
  • 为什么 document.body.offsetHeight + document.body.bottomMargin 不等于 document.documentElement.offsetHeight

    我正在尝试计算 iFrame 的高度 但不明白为什么 document body offsetHeight document body bottomMargin 不相等 document documentElement offsetHeig
  • 哈斯克尔空间泄漏

    all 在尝试解决一些编程测验时 https www hackerrank com challenges missing numbers https www hackerrank com challenges missing numbers
  • Postgresql 增量物化视图维护 (IVM) 挑战,为什么再次推迟到目标版本 16? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 来自 commit fest 的最新消息https wiki postgresql org wiki Incremental View Main
  • 在进程启动之前向进程注入 dll 的优雅方法

    我正在制作一个 mod dll 来修改目标进程的行为 我成功地注入了我的dll并挂钩了目标的一些函数 但是 当我需要在主模块启动之前 更清楚地说 在入口点之前 挂钩一些 API 时 需要做更多的工作 我需要使用 CREATE SUSPEND
  • 如何将 270 度旋转的文本对齐到左上角?

    这应该是一个你会想到的非常简单的问题 我有一个带有一些标题文本的框 我想将其旋转 90 度 我希望它是绝对定位的 以便单词的末尾被轻推到左上角 我可以很容易地将其对齐到底部 但问题是 对于可变长度文本 在对齐到顶部时似乎不可能始终将其保留在
  • Java 中的日语字符编码

    这是我的问题 我现在正在使用 Java Apache POI 读取 Excel xls 或 xlsx 文件 并显示内容 电子表格中有一些日语字符 我得到的所有日语字符都是 在我的输出中 我尝试过使用Shift JIS UTF 8等多种编码方
  • 抽象超类中的通用 @Inject'd 字段

    考虑一组类似 MVP 的类型 存在一个抽象的 Presenter 带有一个 View 接口 public interface View public abstract class AbstractPresenter
  • 在 TextView 中省略文本大小而不指定 maxLines

    我有一个 TextView 其高度会根据屏幕中的其他组件而变化 我要在此 TextView 中设置很长的文本 因此我想省略它 简单地指定 android ellipsize end 是行不通的 只有同时指定 maxLines 时 椭圆化才起
  • 将图像序列转换为视频文件 android java

    我知道这是一个老问题 我对此进行了很多研究 但似乎没有适当的解决方案 我已经看到了一些方法可以做到这一点 例如 使用 FFmpeg 但它取决于本机代码 所以对我来说不是一个选择 Xuggler API 与上面的原因相同 我正在寻找可以将多个