View Full Version : آموزش: یک پلییر همراه با نمایش مدت زمان پخش
ravand
پنج شنبه 14 خرداد 1394, 12:18 عصر
سلام
من دنبال یه پلییر هستم که فایل mp3 رو پخش کنه و مدن زمان پخش رو هم نشون بده اینکه چند دقیقه طول میکشه این پلییر پخشش تموم بشه؟
من از این استفاده کردم:
package ahang;
import jaco.mp3.player.MP3Player;
import java.io.File;
import java.net.URL;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
public class Main {
public static void main(String[] args) throws Exception {
MP3Player player = new MP3Player();
player.setRepeat(true);
// player.addToPlayList(new File("sound.mp3"));
player.addToPlayList(new URL("http://localhost/sound.mp3"));
player.setBorder(BorderFactory.createEmptyBorder(5 0, 100, 50, 100));
JFrame frame = new JFrame("MP3 Player");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);
frame.getContentPane().add(player);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
ولی همچین چیزی نداشت. هر چی جستجو کردم چیزی پیدا نکردم
متشکرم.
ravand
جمعه 15 خرداد 1394, 11:16 صبح
هر چی دنبال برنامه اش گشتم پیدا نکردم.
حالا اگه کسی روش و الگوریتمشم بگه خودم یه جورایی می نویسم.
من نمیدونم با چه روش و فرمولی میشه مدت زمان پخش فایل صوتی رو بدست اورد؟ که بفهمیم این فایل صوتی چند دقیقه طول میکشه تموم بشه؟
متشکرم.
ahmad.mo74
جمعه 15 خرداد 1394, 11:41 صبح
swing :
http://www.codejava.net/coding/java-audio-player-sample-application-in-swing
javafx :
https://blog.idrsolutions.com/2015/04/javafx-mp3-music-player-embedding-sound-in-your-application/
https://gist.github.com/jewelsea/1446612
http://fxexperience.com/2012/01/fun-javafx-2-0-audio-player/
https://docs.oracle.com/javase/8/javafx/media-tutorial/overview.htm
ravand
شنبه 16 خرداد 1394, 11:24 صبح
این چیزایی که شما دادید کدنویسیشون خیلی زیاده من یه چیز ساده میخواستم.
فکر میکنم این لینک جواب من باشه:
http://stackoverflow.com/questions/3009908/how-do-i-get-a-sound-files-total-time-in-java
ولی خب چون من مبتدی ام چیزی ازش سر در نیاوردم.
رفتم استفاده کنم اینطوری شد که کارم نکرد:
package ahang;import jaco.mp3.player.MP3Player;
import java.io.File;
import java.net.URL;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.sound.sampled.spi.AudioFileReader;
import javax.sound.sampled.spi.FormatConversionProvider;
public class Main {
public static void main(String[] args) throws Exception {
MP3Player player = new MP3Player();
player.setRepeat(true);
// player.addToPlayList(new File("sound.mp3"));
player.addToPlayList(new URL("http://localhost/site-ahang/sound2.mp3"));
player.setBorder(BorderFactory.createEmptyBorder(5 0, 100, 50, 100));
String duration = getDurationWithMp3Spi(new File("sound.mp3"));
JFrame frame = new JFrame("MP3 Player");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);
frame.getContentPane().add(player);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private static String 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;
return "time = " + min + ":" + sec;
} else {
throw new UnsupportedAudioFileException();
}
}
}
ravand
یک شنبه 17 خرداد 1394, 12:04 عصر
من هر چی گشتم به جواب نرسیدم. اگه فرمولشم داشته باشم میتونم بسازم. شما میدونی فرمولش چیه؟
E G A L E
سه شنبه 19 خرداد 1394, 12:08 عصر
من هر چی گشتم به جواب نرسیدم. اگه فرمولشم داشته باشم میتونم بسازم. شما میدونی فرمولش چیه؟
دوست عزیز
شما باید با جاوا FX بسازین به خاطر محیط گرافیکیش.
اگر مبتدی هستی این فیلم رو دانلود کن ببین آموزش خیلی کامل و حرفه ای هست. خوبیش پروژه محور هست.
www.youtube.com/watch?v=MBW71PsGpLI
ravand
سه شنبه 19 خرداد 1394, 14:44 عصر
این چیزی که شما دادید یه آموزش کامله اونم فایل فیلم هست. من فقط توی نمایش مدت زمان پخش فاصل صوتی مشکل دارم. میخوام قبل از پخش فایل صوتی بنویسه مدت زمان این فایل صوتی مثلا 12 دقیقه است.
ahmad.mo74
سه شنبه 19 خرداد 1394, 21:13 عصر
برای پیدا کردن مدت زمان فایل صوتی، میشه از Apache Tika (https://tika.apache.org/) استفاده کرد.
برای مثال :
public static void main(String[] args) throws IOException, TikaException, SAXException, UnsupportedAudioFileException {
try (FileInputStream fileInputStream = new FileInputStream("/home/user/Desktop/a.mp3")) {
Metadata metadata = new Metadata();
new AutoDetectParser().parse(fileInputStream, new BodyContentHandler(), metadata, new ParseContext());
long durationNanos = (long) (Double.parseDouble(metadata.get("xmpDM:duration")) * 1000000L);
System.out.println("duration in nanos : " + durationNanos);
long hours = TimeUnit.NANOSECONDS.toHours(durationNanos);
durationNanos -= TimeUnit.HOURS.toNanos(hours);
long minutes = TimeUnit.NANOSECONDS.toMinutes(durationNanos);
durationNanos -= TimeUnit.MINUTES.toNanos(minutes);
long seconds = TimeUnit.NANOSECONDS.toSeconds(durationNanos);
System.out.printf("Duration : %02d:%02d:%02d", hours, minutes, seconds);
}
}
این jar هارو به پروژتون اضافه کنید :
tika-core-1.8.jar
tika-parsers-1.8.jar
ravand
چهارشنبه 20 خرداد 1394, 12:17 عصر
من به این لینک ها سر زدم و کتابخانه هاش رو دانلود کردم:
http://www.java2s.com/Code/Jar/t/Downloadtikacore13jar.htm
http://services.10pines.com:8081/artifactory/repo/org/apache/tika/tika-core/1.8/
http://www.java2s.com/Code/Jar/t/Downloadtikaparsersjar.htm
ولی دستورات import براش رو نمیدونم چیا هستن؟
متشکرم.
ahmad.mo74
چهارشنبه 20 خرداد 1394, 14:08 عصر
AudioUtil.java :
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.sax.BodyContentHandler;
import org.xml.sax.SAXException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @author avb
*/
public class AudioUtil {
private static final long NANOS_IN_A_MILLISECOND = 1000000L;
public static Duration getDuration(File audioFile) throws IOException, TikaException, SAXException {
try (FileInputStream fileInputStream = new FileInputStream(audioFile)) {
Metadata metadata = new Metadata();
new AutoDetectParser().parse(fileInputStream, new BodyContentHandler(), metadata, new ParseContext());
String s = metadata.get("xmpDM:duration");
if (s != null && !s.isEmpty()) {
long durationNanos = (long) (Double.parseDouble(s) * NANOS_IN_A_MILLISECOND);
return Duration.of(durationNanos);
}
}
return Duration.of(0);
}
public static void main(String[] args) throws TikaException, IOException, SAXException {
System.out.println("Duration : " + AudioUtil.getDuration(new File("file.mp3")));
}
}
Duration.java :
import java.util.concurrent.TimeUnit;
/**
* @author avb
*/
public class Duration {
private long totalDurationNanos;
private long hours;
private long minutes;
private long seconds;
private long millis;
private long nanos;
public Duration(long totalDurationNanos) {
this.totalDurationNanos = totalDurationNanos;
hours = TimeUnit.NANOSECONDS.toHours(totalDurationNanos);
totalDurationNanos -= TimeUnit.HOURS.toNanos(hours);
minutes = TimeUnit.NANOSECONDS.toMinutes(totalDurationNanos) ;
totalDurationNanos -= TimeUnit.MINUTES.toNanos(minutes);
seconds = TimeUnit.NANOSECONDS.toSeconds(totalDurationNanos) ;
totalDurationNanos -= TimeUnit.SECONDS.toNanos(seconds);
millis = TimeUnit.NANOSECONDS.toMillis(totalDurationNanos);
totalDurationNanos -= TimeUnit.MILLISECONDS.toNanos(millis);
nanos = totalDurationNanos;
}
public Duration(long hours, long minutes, long seconds, long millis, long nanos) {
this(toNanos(hours, minutes, seconds, millis, nanos), hours, minutes, seconds, millis, nanos);
}
private Duration(long totalDurationNanos, long hours, long minutes, long seconds, long millis, long nanos) {
this.totalDurationNanos = totalDurationNanos;
this.hours = hours;
this.minutes = minutes;
this.seconds = seconds;
this.millis = millis;
this.nanos = nanos;
}
public static Duration of(long totalDurationNanos) {
return new Duration(totalDurationNanos);
}
private static long toNanos(long hours, long minutes, long seconds, long millis, long nanos) {
if (minutes >= 60 || seconds >= 60) {
throw new IllegalArgumentException();
}
return TimeUnit.HOURS.toNanos(hours)
+ TimeUnit.MINUTES.toNanos(minutes)
+ TimeUnit.SECONDS.toNanos(seconds)
+ TimeUnit.MILLISECONDS.toNanos(millis)
+ TimeUnit.NANOSECONDS.toNanos(nanos);
}
public long getTotalDurationNanos() {
return totalDurationNanos;
}
public void setTotalDurationNanos(long totalDurationNanos) {
this.totalDurationNanos = totalDurationNanos;
}
public long getHours() {
return hours;
}
public void setHours(long hours) {
this.hours = hours;
}
public long getMinutes() {
return minutes;
}
public void setMinutes(long minutes) {
this.minutes = minutes;
}
public long getSeconds() {
return seconds;
}
public void setSeconds(long seconds) {
this.seconds = seconds;
}
public long getMillis() {
return millis;
}
public void setMillis(long millis) {
this.millis = millis;
}
public long getNanos() {
return nanos;
}
public void setNanos(long nanos) {
this.nanos = nanos;
}
@Override
public String toString() {
return String.format("%02d:%02d:%02d.%03d", hours, minutes, seconds, millis);
}
}
http://mvnrepository.com/artifact/org.apache.tika/tika-core/1.8
http://mvnrepository.com/artifact/org.apache.tika/tika-parsers/1.8
ravand
یک شنبه 24 خرداد 1394, 11:54 صبح
اونقدر گشتم تا یکی پیدا کردم که ساده تر بود:
package ahang;import java.io.*;
import javazoom.jl.decoder.*;
import javax.sound.sampled.*;
public class Main
{
public static void main(String args[])
{
try
{
File f = new File("sound4.mp3");
Bitstream m_bitstream = new Bitstream(new FileInputStream(f));
Header m_header = m_bitstream.readFrame();
int mediaLength = (int)f.length();
int nTotalMS = 0;
if (mediaLength != AudioSystem.NOT_SPECIFIED) {
nTotalMS = Math.round(m_header.total_ms(mediaLength));
}
System.out.println("Length in ms: " + nTotalMS);
} catch(Exception e) {
e.printStackTrace();
}
}
}
امدم چند تا فایل روش امتحان کردم:
فایل sound.mp3 مدت زمانش : 10:24s معادل 624 ثانیه. که برنامه این خروجی رو داد: 625392
فکر میکنم باید تقسیم بر هزار کنم.
منبع مطلب:
http://www.jsresources.org/faq_audio.html
ahmad.mo74
یک شنبه 24 خرداد 1394, 12:57 عصر
از کلاس java.util.concurrent.TimeUnit میتونید استفاده کنید برای تبدیل میلی ثانیه به HH:mm:ss.SSS
در ضمن به جای اون کلاس Duration که من نوشتم، از java.time.Duration استفاده کنید بهتره.
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.sax.BodyContentHandler;
import org.xml.sax.SAXException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.ParseException;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
/**
* @author avb
*/
public class AudioUtil {
private static final String XMP_DM_DURATION = "xmpDM:duration";
public static Duration getDuration(File audioFile) throws IOException, TikaException, SAXException {
try (FileInputStream fileInputStream = new FileInputStream(audioFile)) {
Metadata metadata = new Metadata();
new AutoDetectParser().parse(fileInputStream, new BodyContentHandler(), metadata, new ParseContext());
String s = metadata.get(XMP_DM_DURATION);
if (s != null && !s.isEmpty()) {
long durationMillis = (long) (Double.parseDouble(s));
return Duration.of(durationMillis, ChronoUnit.MILLIS);
}
}
return Duration.of(0, ChronoUnit.SECONDS);
}
public static void main(String[] args) throws TikaException, IOException, SAXException, ParseException {
Duration duration = AudioUtil.getDuration(new File("file.mp3"));
String durationStr = DurationFormatter.format(duration);
System.out.println("Duration : " + durationStr);
System.out.println("Duration in millis : " + DurationFormatter.parse(durationStr));
}
}
DurationFormatter.java :
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
/**
* @author avb
*/
public class DurationFormatter {
private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
private static final String EPOCH_DATE_STR = "1970-01-01 ";
private static final String DURATION_FORMAT = "%02d:%02d:%02d.%03d";
static {
DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC"));
}
public static String format(Duration duration) {
return format(duration.toMillis());
}
public static String format(long millis) {
long hours = TimeUnit.MILLISECONDS.toHours(millis);
millis -= TimeUnit.HOURS.toMillis(hours);
long minutes = TimeUnit.MILLISECONDS.toMinutes(millis);
millis -= TimeUnit.MINUTES.toMillis(minutes);
long seconds = TimeUnit.MILLISECONDS.toSeconds(millis);
millis -= TimeUnit.SECONDS.toMillis(seconds);
return String.format(DURATION_FORMAT, hours, minutes, seconds, millis);
}
public static long parse(String source) throws ParseException {
return DATE_FORMAT.parse(EPOCH_DATE_STR + source).getTime();
}
}
خروجی :
Duration : 00:03:20.997
Duration in millis : 200997
ravand
سه شنبه 02 تیر 1394, 12:32 عصر
یکی پیدا کردم خیلی ساده تره:
package ahang;
import javax.swing.JOptionPane; // import JOptionpane.
public class converttime {
// Main Method.
public static void main(String[] args) {
long millisec = 225019;
// Promt to user to enter milliseconds.
String time = convertMillis(millisec); // convert milliseconds.
prntStr(millisec+" milliseconds is equal to "+ time); // Print hour:munite:second
} // End of main method.
/** Convert Millisecond to hour:munite:second */
public static String convertMillis(long millis){
long sumsecond,second,summunite,munite,hour; // Declare variables.
sumsecond = millis/1000; // sum of second
second = sumsecond%60; // munite
summunite = sumsecond/60; // sum of munite
munite = summunite%60; // munite
hour = summunite/60; // hour
String result = hour+":"+munite+":"+second;
return result;
} // End of convertMillis method.
/** Print String */
public static void prntStr(String print){
System.out.print(print);
} // Enf of prntStr method.
} // End of public class.
منبع: http://www.akifarslan.com.tr/java/java-convert-milliseconds-to-hours-minutes-and-seconds/
ravand
پنج شنبه 04 تیر 1394, 14:37 عصر
حالا موندم چطوری اهنگ رو از روی سایت بگیرم و مدت زمانش رو نشون بدم؟الان این آهنگ توی خود سیستمم هست اگه روی سایت باشه چی؟
ravand
شنبه 06 تیر 1394, 11:47 صبح
امدم به این شکلش کردم:
package ahang;import static ahang.converttime.convertMillis;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.sql.Connection;
import javazoom.jl.decoder.*;
import javax.sound.sampled.*;
import javax.swing.JOptionPane;
public class Main
{
public static void main(String args[])
{
try
{
URL url = new URL("http://localhost/site-ahang/sound1.mp3");
URLConnection cn = url.openConnection();
InputStream inputFromURL = cn.getInputStream();
int mediaLength = inputFromURL.available();
Bitstream m_bitstream = new Bitstream(inputFromURL);
Header m_header = m_bitstream.readFrame();
long nTotalMS = 0;
if (mediaLength != AudioSystem.NOT_SPECIFIED) {
nTotalMS = Math.round(m_header.total_ms(mediaLength));
}
String time = convertMillis(nTotalMS); // convert milliseconds.
System.out.println("Length in ms: " + time);
} catch(Exception e) {
e.printStackTrace();
}
}
/** Convert Millisecond to hour:munite:second */
public static String convertMillis(long millis){
long sumsecond,second,summunite,munite,hour; // Declare variables.
sumsecond = millis/1000; // sum of second
second = sumsecond%60; // munite
summunite = sumsecond/60; // sum of munite
munite = summunite%60; // munite
hour = summunite/60; // hour
String result = hour+":"+munite+":"+second;
return result;
} // End of convertMillis method.
}
حالا مشکلش اینه که اهنگی که مدتش 10:24 هست اینطوری نشون میده:
Length in ms: 0:0:3
یعنی خروجی رو داره اشتباه نشون میده.
ahmad.mo74
سه شنبه 09 تیر 1394, 09:53 صبح
import javazoom.jl.decoder.Bitstream;
import javazoom.jl.decoder.Header;
import javax.sound.sampled.AudioSystem;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class Main {
public static void main(String args[]) throws Exception {
try (InputStream inputStream = downloadMp3("http://localhost/site-ahang/sound1.mp3")) {
if (inputStream != null) {
int mediaLength = inputStream.available();
Bitstream bitstream = new Bitstream(inputStream);
Header m_header = bitstream.readFrame();
long nTotalMS = 0;
if (mediaLength != AudioSystem.NOT_SPECIFIED) {
nTotalMS = Math.round(m_header.total_ms(mediaLength));
}
System.out.println("Length in ms: " + convertMillis(nTotalMS));
}
}
}
public static String convertMillis(long millis) {
long sumSecond, second, sumMinute, minute, hour; // Declare variables.
sumSecond = millis / 1000; // sum of second
second = sumSecond % 60; // minute
sumMinute = sumSecond / 60; // sum of minute
minute = sumMinute % 60; // minute
hour = sumMinute / 60; // hour
return hour + ":" + minute + ":" + second;
}
static InputStream downloadMp3(String urlString) throws IOException {
HttpURLConnection connection = (HttpURLConnection) new URL(urlString).openConnection();
try (InputStream inputStream = connection.getInputStream()) {
if (inputStream.available() == -1) {
return null;
}
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream(inputStream.available())) {
int read;
byte[] bytes = new byte[64 * 1024];
while ((read = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
return new ByteArrayInputStream(outputStream.toByteArray());
}
}
}
}
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.