Кто-нибудь знает, как получить длину носителя аудио в формате aac (аудиоформат) mp4 (формат файла) в Java?
Любая помощь будет высоко оценен.
Кто-нибудь знает, как получить длину носителя аудио в формате aac (аудиоформат) mp4 (формат файла) в Java?
Любая помощь будет высоко оценен.
Вот решение, которое я нашел (используя mp4parser на 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;
}
muxer (упомянутый @user3489820) был создан из mp4parser и теперь живет отдельно по адресу: org.mp4parser/muxer а>. Пакет Maven был изменен на org.mp4parser/mp4parser
. Для получения дополнительной информации см. https://mvnrepository.com/artifact/org.mp4parser/isoparser и просмотрите IsoParser, мультиплексор и потоковая передача 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();
}
}
Вы можете попробовать этот код...
Файл файл = новый файл («имя файла.mp3»); AudioFileFormat baseFileFormat = новый MpegAudioFileReader().getAudioFileFormat(файл); Свойства карты = baseFileFormat.properties(); Длительная продолжительность = (Длительная) properties.get("duration");
Вы можете использовать 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;
}
Затем проанализируйте вывод для «Длительности»:
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);