java - 使用 ffmpeg 导出 .ogg 音频数据包
问题描述
我的目的是从磁盘读取一个简单的 .ogg 文件,然后将所有音频数据包作为多个 .ogg 文件再次导出到磁盘。
// 创建 AVIOContext (main)
AVIOContext avio = avio_alloc_context(new BytePointer(av_malloc(BUFFER_SIZE)),
BUFFER_SIZE, 1, outputFormatContext, null, writeCallback, null);
outputFormatContext.pb(avio);
ret = avformat_write_header(outputFormatContext, (AVDictionary)null);
// 读取数据包并将它们写入磁盘
AVPacket pkt = new AVPacket();
while (av_read_frame(inputFormatContext, pkt) >= 0)
{
ret = av_write_frame(outputFormatContext, pkt);
if (ret != 0) {
System.out.println("Write frame is failed ");
}
av_packet_unref(pkt);
}
最后,这是我的回调函数:
static int BUFFER_SIZE = 8192;
static class WriteCallback extends Write_packet_Pointer_BytePointer_int {
@Override public int call(Pointer opaque, BytePointer buf, int buf_size) {
try {
File dir = new File("audio_parts");
if (!dir.exists()) {
dir.mkdir();
}
FileOutputStream fos = new FileOutputStream(dir.getAbsolutePath() + "/audio_file_part" + fileCount);
byte[] b = new byte[buf_size];
buf.get(b, 0, buf_size);
fos.write(b, 0, buf_size);
fos.close();
fileCount++;
return buf_size;
}
catch (Throwable t) {
System.err.println("Error on OutputStream.write(): " + t);
return -1;
}
}
}
static WriteCallback writeCallback = new WriteCallback();
实际上,这段代码运行良好,但我对数据包有一些问题。我想一个一个地导出每个数据包,但是对于 test.ogg,每 50 个数据包(50 个数据包 = 1 秒)调用一次回调函数,并且这个数字对于其他音频文件会发生变化。
如何控制回调,是否可以将声音数据包一一提取为 .ogg 文件。
解决方案
推荐阅读
- java - 将圈复杂度保持在 5-10 之间是否会使单元测试更容易?
- django - Heroku 与 AWS - 用于部署带有图像的简单网站
- powershell - 当我尝试使用我的 PowerShell 脚本将用户添加到 AD 时出错
- python - Pandas fillna 从均值与 groupby 多列
- powershell - Powershell - 将 Validateset 参数传递到 ForEach-Object 时遇到问题,提示
- javascript - 如何为我自己的 repo 设置依赖项的要求
- powershell - 根据列表禁用 AD 用户
- javascript - 数组的 JSON 解析问题
- c# - 如何在 Visual Studio 中居中 android 应用程序属性?
- sql - 具有相同最大值的多行 - SQL