我的目的是从磁盘读取一个简单的.ogg文件,并将所有音频包作为多个.ogg文件再次导出到磁盘。
//创建aviocontext(主)
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文件。
暂无答案!
目前还没有任何答案,快来回答吧!