Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取mp3文件';Java中的总时间是多少?_Java_File_Audio_Mp3 - Fatal编程技术网

如何获取mp3文件';Java中的总时间是多少?

如何获取mp3文件';Java中的总时间是多少?,java,file,audio,mp3,Java,File,Audio,Mp3,中提供的答案适用于wav文件,但不适用于mp3文件 它们是(提供一个文件): 以及: 它们对wav文件给出相同的正确结果,但对mp3文件给出错误和不同的结果 你知道我该怎么做才能获得mp3文件的持续时间吗?我在这方面很老套,但我总是简单地获得mp3的规格,编写一个搜索正确位的函数,然后找到它 如果Winamp可以通过读取MP3文件的位流来确定这一点,那么我也可以这样做吗 你也可以,我相信你,伙计 下面是MP3文件结构的详细说明 使用: private static void getDuratio

中提供的答案适用于wav文件,但不适用于mp3文件

它们是(提供一个文件):

以及:

它们对wav文件给出相同的正确结果,但对mp3文件给出错误和不同的结果


你知道我该怎么做才能获得mp3文件的持续时间吗?

我在这方面很老套,但我总是简单地获得mp3的规格,编写一个搜索正确位的函数,然后找到它

如果Winamp可以通过读取MP3文件的位流来确定这一点,那么我也可以这样做吗


你也可以,我相信你,伙计

下面是MP3文件结构的详细说明

使用:

private static void getDurationWithMp3Spi(文件文件)抛出不支持的数据文件异常,IOException{
AudioFileFormat文件格式=AudioSystem.getAudioFileFormat(文件);
if(文件格式实例of TAudioFileFormat){
映射属性=((TAudioFileFormat)fileFormat).properties();
String key=“持续时间”;
长微秒=(长)属性.get(键);
int mili=(int)(微秒/1000);
整数秒=(百万分之一/1000)%60;
最小整数=(千分之几)/60;
System.out.println(“time=“+min+”:“+sec”);
}否则{
抛出新的不支持DaudioFileException();
}
}

以下是获取文件总时间的方法。mp3,我使用的库是
Jlayer 1.0.1

Header h = null;
FileInputStream file = null;
try {
    file = new FileInputStream(filename);
} catch (FileNotFoundException ex) {
    Logger.getLogger(MP3.class.getName()).log(Level.SEVERE, null, ex);
}
bitstream = new Bitstream(file);
try {
    h = bitstream.readFrame();
} catch (BitstreamException ex) {
    Logger.getLogger(MP3.class.getName()).log(Level.SEVERE, null, ex);
}
int size = h.calculate_framesize();
float ms_per_frame = h.ms_per_frame();
int maxSize = h.max_number_of_frames(10000);
float t = h.total_ms(size);
long tn = 0;
try {
    tn = file.getChannel().size();
} catch (IOException ex) {
    Logger.getLogger(MP3.class.getName()).log(Level.SEVERE, null, ex);
}
//System.out.println("Chanel: " + file.getChannel().size());
int min = h.min_number_of_frames(500);
return h.total_ms((int) tn)/1000;

使用
jave-1.0.1.jar
library

  • 它通过了我对wave文件格式的测试,比如:wav-pcm8/16, wav alaw、wav ulaw、wav gsm、wav adpcm
  • 它通过了我对一些MP3文件格式的测试:cbr vs vbr,立体声vs 单通道
  • 它可以支持视频格式,这是我没有测试过的
代码示例:

File source = new File("C:\\22.mp3");
Encoder encoder = new Encoder();
try {
    MultimediaInfo mi = encoder.getInfo(source);
    long ls = mi.getDuration();
    System.out.println("duration(sec) = "+  ls/1000);
} catch (Exception e) {
    e.printStackTrace();
}

我尝试了
Jlayer 1.0.1
,但对于某些MP3格式,它失败了。至于另一个libaray
jaudiotager-2.0.3.jar
,它可以很好地用于MP3格式,但它只能支持wav-pcm8/16。

宝贝,我们是一个团队。直接链接到页面(格式更好):(我正在阅读,谢谢!)我想人们来这里是为了寻找答案,不是为了信仰的话,但无论如何还是要感谢……顺便说一下,我对处理mp3文件一无所知,你有没有关于你所说内容的示例或文章链接?好吧,这就是内置函数如何做到的。MP3是一种规范,这意味着在某种格式的MP3文件的某个索引处,应该写入长度。假设长度是第129字节,您只需将文件作为流加载,转到该部分并将其读取。下面,有人发布了一个MP3文件结构的链接。音频长度没有明确地写在MP3格式的字段中。“MP3是一种规范”。。。。这是真的。但这是一个异常庞大和复杂的版本,包含114页的规范,购买一份需要花费200美元。实现整个规范可能需要单个开发人员几个月的时间。仅仅理解它可能需要数周的工作。正如上面的评论所指出的,这并不像查找包含持续时间的字段并提取它那样简单。是的,有简短的摘要,但是你能确定他们没有遗漏一些关键的东西,可能会使你的结果不正确吗?相关:此方法不适用于此曲目:-此曲目有3:52,但此代码表示它有22:17。刚刚尝试过此方法。
属性
映射中的键是:
mp3.copyright、date、mp3.framesize.bytes、mp3.vbr、mp3.framerate.fps、mp3.id3tag.track、title、mp3.channels、mp3.id3tag.genre、mp3.bitrate.nominal.bps、mp3.padding、mp3.version.mpeg、mp3.crc、mp3.original、mp3.frequency.hz、唱片集、作者、mp3.id3tag.v2、mp3.vbr.scale、mp3.version.encoding、,mp3.version.layer、mp3.id3tag.v2.version、mp3.header.pos、注释
。没有
持续时间
键。我们正在使用此方法,它为11KHz MP3提供了不正确的持续时间(报告实际长度的一半)。我们将寻找其他的东西。我试图使用这个,但我不能。我导入了jar,但没有找到TAudioFileFormat这是我获取文件总时间的方法。mp3,我使用的库是JLlayer 1.0.1这对我来说很好,但答案包含很多不必要的东西。long tn=新文件(filename).length();双倍持续时间=收割台。总重量((内部)tn)/1000;这个库在哪里?许可证是什么?(无法编辑最后一条评论——已经超过5分钟了)。JAVE是自由软件,它是根据GPL授权的。请查收
private static void getDurationWithMp3Spi(File file) throws UnsupportedAudioFileException, IOException {

    AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(file);
    if (fileFormat instanceof TAudioFileFormat) {
        Map<?, ?> properties = ((TAudioFileFormat) fileFormat).properties();
        String key = "duration";
        Long microseconds = (Long) properties.get(key);
        int mili = (int) (microseconds / 1000);
        int sec = (mili / 1000) % 60;
        int min = (mili / 1000) / 60;
        System.out.println("time = " + min + ":" + sec);
    } else {
        throw new UnsupportedAudioFileException();
    }

}
Header h = null;
FileInputStream file = null;
try {
    file = new FileInputStream(filename);
} catch (FileNotFoundException ex) {
    Logger.getLogger(MP3.class.getName()).log(Level.SEVERE, null, ex);
}
bitstream = new Bitstream(file);
try {
    h = bitstream.readFrame();
} catch (BitstreamException ex) {
    Logger.getLogger(MP3.class.getName()).log(Level.SEVERE, null, ex);
}
int size = h.calculate_framesize();
float ms_per_frame = h.ms_per_frame();
int maxSize = h.max_number_of_frames(10000);
float t = h.total_ms(size);
long tn = 0;
try {
    tn = file.getChannel().size();
} catch (IOException ex) {
    Logger.getLogger(MP3.class.getName()).log(Level.SEVERE, null, ex);
}
//System.out.println("Chanel: " + file.getChannel().size());
int min = h.min_number_of_frames(500);
return h.total_ms((int) tn)/1000;
File source = new File("C:\\22.mp3");
Encoder encoder = new Encoder();
try {
    MultimediaInfo mi = encoder.getInfo(source);
    long ls = mi.getDuration();
    System.out.println("duration(sec) = "+  ls/1000);
} catch (Exception e) {
    e.printStackTrace();
}