如何使用 Xuggler 获取音频进行编码

2023-11-26

我正在编写一个记录屏幕和音频的应用程序。虽然屏幕录制工作完美,但我在使用 JDK 库获取原始音频时遇到困难。这是代码:

try {
            // Now, we're going to loop
            long startTime = System.nanoTime();

            System.out.println("Encoding Image.....");
            while (!Thread.currentThread().isInterrupted()) {
                // take the screen shot
                BufferedImage screen = robot.createScreenCapture(screenBounds);


                // convert to the right image type
                BufferedImage bgrScreen = convertToType(screen,
                        BufferedImage.TYPE_3BYTE_BGR);

                // encode the image
                writer.encodeVideo(0, bgrScreen, System.nanoTime()
                        - startTime, TimeUnit.NANOSECONDS);

                /* Need to get audio here and then encode using xuggler. Something like 

                    WaveData wd = new WaveData();

                    TargetDataLine line;
                    AudioInputStream aus = new AudioInputStream(line);

                    short[] samples = getSourceSamples();
                       writer.encodeAudio(0, samples); */


                if (timeCreation < 10) {
                    timeCreation = getGMTTime();
                }
                // sleep for framerate milliseconds
                try {
                    Thread.sleep((long) (1000 / FRAME_RATE.getDouble()));
                } catch (Exception ex) {
                    System.err.println("stopping....");
                    break;
                }

            }
            // Finally we tell the writer to close and write the trailer if
            // needed
        } finally {
            writer.close();
        }

This page有一些伪代码,例如

while(haveMoreAudio())
 {
   short[] samples = getSourceSamples();
   writer.encodeAudio(0, samples);
 }

但我到底应该做什么getSourceSamples()?

另外,还有一个额外的问题 - 是否可以通过这种方法从多个麦克风中进行选择?

也可以看看:Xuggler 编码和复用


尝试这个:

// Pick a format. Need 16 bits, the rest can be set to anything
// It is better to enumerate the formats that the system supports, because getLine() can error out with any particular format
AudioFormat audioFormat = new AudioFormat(44100.0F, 16, 2, true, false); 

// Get default TargetDataLine with that format
DataLine.Info dataLineInfo = new DataLine.Info( TargetDataLine.class, audioFormat );
TargetDataLine line = (TargetDataLine) AudioSystem.getLine(dataLineInfo);

// Open and start capturing audio    
line.open(audioFormat, line.getBufferSize());
line.start();

while (true) {
    // read as raw bytes
    byte[] audioBytes = new byte[ line.getBufferSize() / 2 ]; // best size?
    int numBytesRead = 0;
    numBytesRead =  line.read(audioBytes, 0, audioBytes.length);

    // convert to signed shorts representing samples
    int numSamplesRead = numBytesRead / 2;
    short[] audioSamples = new short[ numSamplesRead ];
    if (format.isBigEndian()) {
        for (int i = 0; i < numSamplesRead; i++) {
            audioSamples[i] = (short)((audioBytes[2*i] << 8) | audioBytes[2*i + 1]);
        }
    }
    else {
        for (int i = 0; i < numSamplesRead; i++) {
            audioSamples[i] = (short)((audioBytes[2*i + 1] << 8) | audioBytes[2*i]);
        }
    }

    // use audioSamples in Xuggler etc
}

要选择麦克风,您可能必须这样做:

Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
// Look through and select a mixer here, different mixers should be different inputs
int selectedMixerIndex = 0;
Mixer mixer = AudioSystem.getMixer(mixerInfo[ selectedMixerIndex ]);
TargetDataLine line = (TargetDataLine) mixer.getLine(dataLineInfo);

我认为多个麦克风可能会在一个调音台中显示为不同的源数据线。在这种情况下,你必须打开它们并调用dataLine.getControl(FloatControl.Type.MASTER_GAIN).setValue( volume );打开和关闭它们。

See: WaveData.java

来自 TargetDataLine 的声波

如何在 Java 中设置 SourceDataLine 的音量

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

如何使用 Xuggler 获取音频进行编码 的相关文章

  • Java中有没有一种方法可以通过名称实例化一个类?

    我正在寻找问题 从字符串名称实例化一个类 https stackoverflow com questions 9854900 instantiate an class from its string name它描述了如何在有名称的情况下实例
  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供

随机推荐

  • 将 Mongoose 文档转换为 json

    我以这种方式将 mongoose 文档作为 json 返回 UserModel find function err users return res end JSON stringify users 但是 user proto 也被返回 没
  • Maven:如何避免版本附加到 Maven 中的 war 文件?

    我使用 Maven 作为构建文件 这是我对要生成的 war 文件名的以下设置 我使用的是 Maven 版本 2 2 1
  • NVarchar、Bin 排序规则、Bin2 排序规则之间有什么区别?

    所有 3 个选项均区分大小写和重音 并支持 Unicode 根据文档 NVarchar 根据 相关语言或字母表的词典 对数据进行排序和比较 Bin 根据 位模式 对数据进行排序和比较 Bin2 根据 Unicode 数据的 Unicode
  • 将 Spring bean 注入 EJB3

    我正在尝试使用以下方法将 Spring beans 注入到 EJB 中 Interceptors SpringBeanAutowiringInterceptor class 但我无法让它与beanRefContext xml我见过的例子 这
  • 如何在 ggplot2 中按时间顺序排列月份而不是写出月份?

    我正在尝试绘制计数与月份的关系图 ggplot dat aes x month y count group region geom line data mcount mcount region West coast colour black
  • AWS Cognito - 从 ADFS 创建组作为 Cognito 组

    应用程序通过 Open ID Connect 协议与AWS认知 它连接到ADFS 通过 SAML 进行通信 Cognito 本质上是 代理 ADFS 服务器 ADFS 持有组映射应用程序需要的 我想将这些组作为实际的 Cognito 组导入
  • C++11 以字符串形式获取当前日期和时间

    在 C 11 中以字符串形式获取日期和时间的最先进方法是什么 我知道关于std put time 但参考文献说我只能在流中使用它 有std chrono system clock它提供了to time t返回时间为time t而且缺少日期
  • Laravel - 擦除包含特定字符串的所有缓存/redis 键

    是否可以使用 Laravel 删除 Redis 中与特定字符串匹配的所有键 例如 如果我想忘记具有单词 products 的键 它会忘记以下键 laravel 896235872385237588327582370375acaca23532
  • 字符串中的“\n”不起作用

    我有一小段适合我的操作系统的代码 print Type your document below print Press enter to save print Type n for a new line file input print E
  • Powershell New-PSSession 访问被拒绝 - 管理员帐户

    我尝试使用 powershell PSSession cmdlet 但我遇到了访问被拒绝错误 我尝试做的是使用管理员帐户运行命令New PSSession or Enter PSSession 不幸的是我收到访问被拒绝错误 我相信我正确地遵
  • 将值设置为 jquery 自动完成组合框

    我在用jquery 自动完成组合框一切都很好 但我也想通过 JavaScript 设置特定值 例如 value val somevalue 它设置为选择元素 但自动完成功能的输入元素没有变化 当然 我可以直接选择这个输入并设置值 但是还有其
  • Clojure 传感器是否急切?

    在这篇博客文章中 JavaScript 中的 CSP 和转换器 作者指出 首先 我们必须认识到许多数组 或其他集合 操作 例如map filter and reverse可以定义为reduce So 然后我们看到Clojure 中的许多实现
  • Windows 8 应用程序上的全局应用程序栏

    我正在开发一个 Windows 8 应用程序项目 我使用的是 Visual Studio 2012 它是预定义的模板 GroupedPage SplitPage ItemsPage 这时候我需要添加一个App栏 我选择的方式是创建一个并将其
  • Polyfill 或 ECMAScript5 新功能的解决方法?

    我想用新的来编写我的JS代码ECMAScript5 特性今天和未来都有效 由于并非所有浏览器都支持所有功能 尤其是 IE 例如Object create Array isArray or JSON 我知道一些解决方法 例如使用json2 j
  • 尝试获取 ImageView 中图像的显示尺寸

    我正在尝试获取图像视图中显示的图像的实际大小 实际上我的图像比屏幕大 图像视图正在调整图像大小以显示它 我正在寻找这个新尺寸 我试图在自定义视图中重写 ImageView 的 onDraw 方法 但我没有得到正确的高度和宽度 public
  • 如何在 C# 中解码 HTML 字符?

    我有用 HTML 字符实体编码的电子邮件地址 NET 中有什么可以将它们转换为纯字符串吗 您可以使用HttpUtility HtmlDecode 如果您使用 NET 4 0 您还可以使用WebUtility HtmlDecode它不需要额外
  • Android 中的 OpenCV 模板匹配示例

    我是 OpenCV 的初学者 我正在尝试制作一个示例 Android 应用程序 以使用 OpenCV 模板匹配来匹配给定图像中的模板图像 我在互联网上搜索 找不到合适的 android 或 java 代码来满足我的要求 但我有 C 代码 我
  • SQLite Android 无法打开数据库文件

    编辑 我在手机上尝试过 它可以工作 有人能告诉我为什么它不能在模拟器上工作吗 我正在尝试在 Android 上打开数据库 但它抛出 无法打开数据库文件 异常 在调试器中 似乎错误发生在线路上mDb mDbHelper getWritable
  • Gradle 项目刷新失败:已完成

    背景 此时我已经与 Studio Gradle 斗争了一天左右 最初存在多个 PEBKAC 错误 即权限和资源限制 但后来已得到解决 不幸的是 google fu 因当前错误而使我失败 尝试完成时特别发生错误 gradlew clean没有
  • 如何使用 Xuggler 获取音频进行编码

    我正在编写一个记录屏幕和音频的应用程序 虽然屏幕录制工作完美 但我在使用 JDK 库获取原始音频时遇到困难 这是代码 try Now we re going to loop long startTime System nanoTime Sy