- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 Ogg Vorbis SPI作为解码 .ogg
文件的一种方式。
我用于加载 .ogg
文件并转换为 PCM 的代码片段与文档中建议的代码片段没有太大的不同:
// The streams are valid at this point.
try (InputStream bin = new BufferedInputStream(file.getInputStream(entry) );
AudioInputStream in = AudioSystem.getAudioInputStream(bin) ) {
AudioFormat baseFormat = in.getFormat();
// At this point the format is valid:
// VORBISENC 44100.0 Hz, unknown bits per sample, mono, 1 bytes/frame, 12000.0 frames/second,
// I can't make a Clip directly from this or it will be all buzzy, so I convert to PCM
// Decoding to PCM
AudioFormat decodedFormat =
new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
baseFormat.getSampleRate(),
16,
baseFormat.getChannels(),
baseFormat.getChannels() * 2,
baseFormat.getSampleRate(),
false);
// This is where the issues appear...
AudioInputStream decodedInputStream = AudioSystem.getAudioInputStream(decodedFormat, in);
Clip clip = AudioSystem.getClip();
clip.open(decodedInputStream);
// entry.getName is basically the filename. Any files with '0' frame length didn't get converted properly.
System.out.println("Clip " + entry.getName() + " loaded at " + clip.getFrameLength() + " frame length");
return clip;
} catch { ... }
发生的事情是我正在加载几个小的声音文件,范围从 5K 的低到 32K 的高(ogg 格式)。但是,一些文件无法正确转换为 PCM。我注意到他们都有一些共同点;它们的尺寸范围为 5K - 6K。声音文件似乎在 7K 左右开始正确转换。我通过获取 11K 声音并将其削减直到它不再转换 (~6K) 来对此进行测试
我认为解决这个问题的一种方法是添加一些听不见的噪音来填充大小,但我更愿意只正确转换声音文件而不管大小。除了 API 本身之外,我对声音表示的概念是全新的,我不知道从哪里开始寻找为什么会发生这种情况。
最佳答案
我遇到了和你一样的情况,似乎在编码小文件和不适合原始缓冲区长度的文件时(很幸运)会由于 Vorbis 中的错误而被删除SPI 实现 - 它真的很旧,我希望他们会支持它并修复它。作为解决方法,您可以在 2 个位置修复 DecodedVorbisAudioInputStream.java:
private int readFromStream(byte[] buffer, int index, int bufferSize_) {
int bytes = 0;
try {
bytes = oggBitStream_.read(buffer, index, bufferSize_);
}
catch (Exception e) {
if (TDebug.TraceAudioConverter)
TDebug.out("Cannot Read Selected Song");
bytes = -1;
}
if (bytes >= 0) {
currentBytes += bytes;
}
return bytes;
}
并从缓冲区读取:
case playState_ReadData:
int result;
index = oggSyncState_.buffer(bufferSize_);
buffer = oggSyncState_.data;
bytes = readFromStream(buffer, index, bufferSize_);
if (TDebug.TraceAudioConverter) {
TDebug.out("More data : " + bytes);
}
// has no data in buffer also
if (bytes == -1 && bufferSize_ - index == 0) {
playState = playState_Done;
if (TDebug.TraceAudioConverter) {
TDebug.out("Ogg Stream empty. Settings playState to playState_Done.");
}
break;
}
else {
if (bytes != -1) {
oggSyncState_.wrote(bytes);
}
if (bytes == 0 && bufferSize_ - index == 0) {
if ((oggPage_.eos() != 0) || (oggStreamState_.e_o_s != 0) || (oggPacket_.e_o_s != 0)) {
if (TDebug.TraceAudioConverter) {
TDebug.out("oggSyncState wrote 0 bytes: settings playState to playState_Done.");
}
playState = playState_Done;
}
if (TDebug.TraceAudioConverter) {
TDebug.out("oggSyncState wrote 0 bytes: but stream not yet empty.");
}
break;
}
}
result = oggSyncState_.pageout(oggPage_);
if (result == 0) {
if (TDebug.TraceAudioConverter) {
TDebug.out("Setting playState to playState_ReadData.");
}
playState = playState_ReadData;
break;
} // need more data
if (result == -1) { // missing or corrupt data at this page position
if (TDebug.TraceAudioConverter)
TDebug.out("Corrupt or missing data in bitstream; setting playState to playState_ReadData");
playState = playState_ReadData;
break;
}
oggStreamState_.pagein(oggPage_);
if (TDebug.TraceAudioConverter)
TDebug.out("Setting playState to playState_WriteData.");
playState = playState_WriteData;
break;
在读取时,它们会忽略已经从缓冲区中读取的字节,因此,它们只会跳过缓冲区中最后读取的字节。
希望对您有所帮助!
关于java - 对于小文件大小,使用 Ogg Vorbis SPI 解码 .ogg 文件失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23747940/
我正在尝试编写一个C#程序,该程序可以读取MP4文件并以Ogg Vorbis格式转换音频,但是这里有个要点:我需要100 ms采样,以便可以对base64进行单独编码。 因此,音频从MP4文件转换为o
我正在尝试使用 Xuggler 将音频格式转换为 ogg ( vorbis ) 文件。 首先,我尝试了最基本的方法, IMediaReader readermp3 = ToolFactory.make
我正在使用 tritonous 包在 ogg-vorbis 中进行音频编码。当我提供音频格式时,我遇到了问题。 Unsupported conversion: VORBIS 44100.0Hz, u
我已经使用 android AudioRecord 录制了语音,我想将其转换为 ogg vorbis,因为它是免费的。我已经尝试过 vorbis-java beta,但它似乎不起作用或者我犯了一些错误
我想以 ogg/vorbis 格式解码一些音频流。我已经在这里找到了 MP3 和 MP2 解码的示例:http://ffmpeg.org/doxygen/trunk/decoding__encodin
我正在尝试将多个 ogg vorbis 文件连接成一个。 我知道理论上应该足够了: cat 1.ogg 2.ogg > combined.ogg 但这有缺点: 并非所有播放器都支持这样创建的文件(gs
我正在寻找 ogg vorbis header 数据包格式的规范。我在互联网上搜索过,但没有取得多大成功。我在哪里可以找到一个? 最佳答案 http://en.wikipedia.org/wiki/O
所以,这里我有一个来自我网站的演示文件 http://members.shaw.ca/darolynk/breakup/html5game/snd_music.ogg 我正在运行 Firefox Be
我想编写一个通过网络传输音频和视频的应用程序。作为一个简单的开始,我想尝试一下音频部分。 我想通过网络从我的麦克风传输 vorbis 编码的音频。我从接收器的以下管道开始: gst-launch-0.
如何使用 libvorbis 和/或 libvorbisfile 确定 Ogg Vorbis 流的长度(以秒为单位)? 据我所知,vorbis_info 中没有任何内容。告诉我流长度的结构。 最佳答案
我已经实现并正在运行 OGG vorbis 库来使用给定的库播放 .ogg 格式音频文件 here ..但问题是,它在任何时候都会给出此异常并使应用程序崩溃, -[IDZAQAudioPlayer
我在为 flv 文件加载 AVCodec 时遇到问题。 (加载mp3或者avi文件好像没有问题) 实际错误是: [vorbis @ 0x1550aa0] Extradata missing. 所以我会
我想知道 Android 设备对音频编解码器的支持是什么。 这里我发现2.3和4.0只支持mp3编解码: http://html5test.com/compare/browser/android23/
我想知道是否可以使用 iPhone SDK 播放 Ogg Vorbis 音频文件,或者是否存在允许这样做的库或框架。 我读过一些有关 OpenAL 的内容,但没有找到任何教程...谁能帮我吗? 最佳答
我正在尝试在 RemoteIO 中播放 Ogg Vorbis 文件,我使用以下代码从 vorbis 中获取 PCM 样本:我正在尝试在 RemoteIO 中播放 Ogg Vorbis 文件,我使用以下
我在学校有一个小组项目(3D FPS 游戏),我使用 C++ 中的 OpenAL 和 OGG Vorbis 对音频进行编程。我们的编译器设置为警告我们已定义但未使用的变量,结果证明这是 Vorbis
好吧,我花了一天的大部分时间来尝试这样做,我想我肯定遗漏了一些相当明显的东西。 Android SDK 显然原生支持 Vorbis 文件.有没有什么方法可以作为开发人员访问这些库。 情况:我有一个项目
我制作了一个测试应用程序以转码为 vorbis 格式(webm 容器)。 到目前为止,基于 FFmpeg 示例,一切正常,输出文件正常播放,但右声道声音丢失。我尝试寻找不同的可能性,但到目前为止找不到
我有几个视频要编码为 vp8 用于视频和 Vorbis 用于音频。这是我目前正在使用的 FFmpeg 命令: ffmpeg -y -i input.mp4 -map 0:v:0 -s 640x360
我想在 Silverlight 中从 http 播放 ogg vorbis 音频。我需要什么才能做到这一点? 最佳答案 比“Silverlight 不支持 Ogg Vorbis”更好的答案是说 Sil
我是一名优秀的程序员,十分优秀!