Java - AAC MP4 - 如何获取媒体长度?

时间:2014-09-02 11:31:08

标签: java mp4 aac

有人知道如何用Java获取aac(音频格式)mp4(文件格式)音频的媒体长度吗?

任何帮助都将受到高度赞赏。

4 个答案:

答案 0 :(得分:2)

以下是我找到的解决方案(使用mp4parser on github):

public static long getAudioLength(byte[] content) throws Exception {
    IsoFile isoFile = new IsoFile(new MemoryDataSourceImpl(content));
    double lengthInSeconds = (double)isoFile.getMovieBox().getMovieHeaderBox().getDuration() / isoFile.getMovieBox().getMovieHeaderBox().getTimescale();
    return (long)lengthInSeconds;
}

答案 1 :(得分:0)

muxer(由@ user3489820提及)是从mp4parser中调出的,现在单独位于:org.mp4parser/muxer。 Maven软件包已更改为org.mp4parser/mp4parser。有关更多信息,请参见https://mvnrepository.com/artifact/org.mp4parser/isoparserIsoParsermuxerstreaming JavaDoc。

我更新了@ user3489820的代​​码示例,添加了导入,排除了冗余代码并消除了不必要的强制转换。我还删除了MemoryDataSourceImpl调用,因为我的项目需要发现磁盘上MP4文件的长度,并且不需要该类:

import java.io.File;
import org.mp4parser.IsoFile;
import org.mp4parser.boxes.iso14496.part12.MovieHeaderBox;

public class Blah {
    public static long getAudioLength(File file) throws Exception {
        IsoFile isoFile = new IsoFile(file);
        MovieHeaderBox mhb = isoFile.getMovieBox().getMovieHeaderBox();
        return mhb.getDuration() / mhb.getTimescale();
    }
}

答案 2 :(得分:-1)

你可以尝试这段代码......

文件文件=新文件(" filename.mp3"); AudioFileFormat baseFileFormat = new MpegAudioFileReader()。getAudioFileFormat(file); Map properties = baseFileFormat.properties(); 持续时间长=(长)属性.get("持续时间");

答案 3 :(得分:-1)

您可以使用ffmpeg获取任何媒体的播放时间:

首先从运行时获取命令的输出:

  public String execute(String cmd) {
    String output=null;
      try {
        Runtime rt = Runtime.getRuntime();
        Process pr=rt.exec(cmd);
        final InputStream es=pr.getErrorStream();
        class C extends Thread {
          String type, output="";
          InputStream is;
          public C(InputStream is, String type) { this.is=is; this.type=type; }
          public void run() {
            try {
              InputStreamReader isr = new InputStreamReader(is);
              BufferedReader br = new BufferedReader(isr);
              String line=null;
              while((line=br.readLine())!=null)
                output+=line+" ";
            }
            catch (IOException ioe) { ioe.printStackTrace(); }
          }
        };
        C t=new C(es);
        t.start();
        int exitVal=pr.waitFor();
        System.out.println("ExitValue: " + exitVal);
        output=""+t.output;
      }
      catch(Throwable t) { t.printStackTrace(); }
      return output;
  }

然后解析“ Duration”的输出:

  public int getTime(String out) {
    int i=0, j=0, k, l, x=0, y=0, ind=0;
    String d="", frs="";
    BufferedReader dis=null;
    String nextline=out;
    ind=0;
    if((ind=nextline.indexOf("Duration:"))>-1)
      d=nextline.substring(ind+9, nextline.indexOf(',', ind+1)).trim();
      int ind2=0;
      int h=0, m=0, s=0, xxx=0;
      if((ind=d.indexOf(":"))>-1) {
        h=Integer.parseInt(d.substring(ind2, ind));
        ind2=ind+1;
      }
      if((ind=d.indexOf(":", ind+1))>-1) {
        m=Integer.parseInt(d.substring(ind2, ind));
        ind2=ind+1;
      }
      if((ind=d.indexOf(".", ind+1))>-1) {
        s=Integer.parseInt(d.substring(ind2, ind));
      }
      if(ind<d.length()) {
        ind2=ind+1;
        if((ind=d.indexOf(".", ind+1))>-1) {
          xxx=Integer.parseInt(d.substring(ind2, d.length()));
        }
      }
      try {
        dis.close();
      }
      catch (Exception ex) { }
    return h*3600+m*60+s;
  }

总计:

  String out=execute("ffmpeg -i myfile.mp4");
  int time=getTime(out);