Java播放AAC编码音频(JAAD解码器)

我一直在努力用Java播放aac编码的音频文件。

我们在第一学期结束时有一个小组项目,并希望在那里有背景音乐和很​​少的声音效果。 最后我们使用了WAV文件,因为我们无法播放AAC。

这个周末我再试一次,再次搜索,并从不同的网站一起搜索了一个工作代码,但没有一个完整的工作解决方案。

为了在未来的项目中使用更舒适,我为我做了一个小型的aac播放库。

由于很难找到合适的解决方案,我想与您分享,希望将来有一个问题相同的人会更轻松一点。
以下代码是我写的lib的片段。 您可以在AACPlayer上查看我的GitHub上的整个lib。
该lib /解决方案使用aac解码器JAAD 。

public static void play(File[] files) { // local vars byte[] b; // array for the actual audio Data during the playback AudioTrack track; // track we are playing atm AudioFormat af; // the track's format SourceDataLine line; // the line we'll use the get our audio to the speaker's Decoder dec; // decoder to get the audio bytes Frame frame; // SampleBuffer buf; // int currentTrack; // index of current track from playlist MP4Container cont; // container to open the current track with Movie movie; // and get the content from the container try { // for-next loop to play each titel from the playlist once for (currentTrack = 0; currentTrack < files.length; currentTrack++) { cont = new MP4Container(new RandomAccessFile(files[currentTrack], "r")); // open titel with random access movie = cont.getMovie(); // get content from container, List content = movie.getTracks(); if (content.isEmpty()) // check if container HAS content throw new Exception ("insert error message here"); // if so, track = (AudioTrack) movie.getTracks().get(0); // grab first track and set the audioformat af = new AudioFormat(track.getSampleRate(), track.getSampleSize(), track.getChannelCount(), true, true); line = AudioSystem.getSourceDataLine(af); // get a DataLine from the AudioSystem line.open(); // open and line.start(); // start it dec = new Decoder(track.getDecoderSpecificInfo()); buf = new SampleBuffer(); while(track.hasMoreFrames()) // while we have frames left { frame = track.readNextFrame(); // read next frame, dec.decodeFrame(frame.getData(), buf); // decode it and put into the buffer b = buf.getData(); // write the frame data from the buffer to our byte-array line.write(b, 0, b.length); // and from there write the byte array into our open AudioSystem DataLine while (paused) // check if we should pause { Thread.sleep(500); // if yes, stay half a second if (Thread.interrupted()) // check if we should stop possibly { line.close(); // if yes, close line and return; // exit thread } } if (Thread.interrupted()) // if not in pause, still check on each frame if we should { // stop. If so line.close(); // close line and return; // exit thread } } line.close(); // after titel is over, close line if (loop) // if we should loop current titel, set currentTrack -1, currentTrack--; // as on bottom of for-next it get's +1 and so the same titel get's played again else if (repeat && (currentTrack == files.length -1)) // else check if we are at the end of the playlist currentTrack = -1; // and should repeat the whole list. If so, set currentTrack -1, so it get's 0 on for-next bottom } } catch (LineUnavailableException | IOException | InterruptedException e) { e.printStackTrace(); } } 
Interesting Posts