微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

缺少 .ogg 音频数据包

如何解决缺少 .ogg 音频数据包

我使用 av_read_frame 读取 .ogg 数据包,然后使用 av_write_frame 写入磁盘。

while (av_read_frame(inputFormatContext,pkt) >= 0) 
        {
 ret = av_write_frame(outputFormatContext,pkt);
            if (ret != 0) {
                System.out.println("Write frame is Failed ");
            }
         }

这是我对 av_write_frame 的回调函数

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,buf_size);
                fos.write(b,buf_size);
                fos.flush();
                fos.close(); 
                fileCount++;
                return buf_size;
            }
            catch (Throwable t) {
                System.err.println("Error on OutputStream.write(): " + t);
                return -1;
            }
        }
    }

代码运行良好,但有些地方我没有理解。对于这个 .ogg 文件,回调必须每 50 个数据包工作一次。

但它的工作原理如下:

0-100
100-150
150-200
200-250
...

时基 = 48000 和数据包点:

0. packets = -120
49. packet = 47880 
99. packet = 95,760

结果第一秒我的包丢失了(第一包和第二包没有合并)。这可能是什么原因?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。