Advertisement
Ancurio

Decoder

Jun 10th, 2019
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.42 KB | None | 0 0
  1. import java.io.FileNotFoundException;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import java.util.Arrays;
  6. import java.util.List;
  7.  
  8. import io.kaitai.struct.Ogg;
  9.  
  10. import org.concentus.OpusDecoder;
  11. import org.concentus.OpusException;
  12.  
  13. import org.xiph.libogg.*;
  14.  
  15. import javax.sound.sampled.*;
  16.  
  17. public class MainKlass {
  18. int sampleRate;
  19. int channelCount;
  20.  
  21. OpusDecoder opusDec;
  22. short[] pcmBuffer = new short[5760*4];
  23.  
  24. ArrayList<Short> outBuffer = new ArrayList<Short>(0);
  25.  
  26. // interne Funktion, nicht hier aendern sondern oben ^^^
  27. private void onPacket(byte[] oggPacket) {
  28. // System.out.println("Packet len: " + oggPacket.length);
  29.  
  30. try {
  31. // decLen is in FRAMES!!
  32. int decLen = opusDec.decode(oggPacket, 0, oggPacket.length,
  33. pcmBuffer, 0, pcmBuffer.length, false);
  34.  
  35. final int sampleCount = decLen*channelCount;
  36.  
  37. Short[] tmp = new Short[sampleCount];
  38. for (int i = 0; i < sampleCount; ++i) {
  39. tmp[i] = pcmBuffer[i];
  40. }
  41.  
  42. outBuffer.addAll(Arrays.asList(tmp));
  43. } catch (OpusException e) {
  44. // TODO Auto-generated catch block
  45. e.printStackTrace();
  46. }
  47. }
  48.  
  49. public Short[] getSamples() {
  50. return outBuffer.toArray(new Short[0]);
  51. }
  52.  
  53. public OpusDecoder(String opusFile, int freq, int chan) {
  54. this.sampleRate = freq;
  55. this.channelCount = chan;
  56.  
  57. try {
  58. opusDec = new OpusDecoder(sampleRate, channelCount);
  59. } catch (OpusException e) {
  60. // TODO Auto-generated catch block
  61. e.printStackTrace();
  62. }
  63.  
  64. Ogg oggParser = null;
  65. try {
  66. oggParser = Ogg.fromFile(opusFile);
  67. } catch (IOException idc) {
  68.  
  69. }
  70.  
  71. ArrayList<Ogg.Page> pages = oggParser.pages();
  72. byte[] packetBuffer = new byte[0];
  73.  
  74. for (Ogg.Page p : pages.subList(2, pages.size())) {
  75. ArrayList<byte[]> segments = p.segments();
  76.  
  77. // System.out.println("--- Segment start ---");
  78. for (byte[] s : segments) {
  79. byte[] tmp = new byte[packetBuffer.length + s.length];
  80. System.arraycopy(packetBuffer, 0, tmp, 0, packetBuffer.length);
  81. System.arraycopy(s, 0, tmp, packetBuffer.length, s.length);
  82.  
  83. packetBuffer = tmp;
  84.  
  85. if (s.length < 255) {
  86. // System.out.println("Packet size: " + packetBuffer.length);
  87. // System.out.println(pcmBuffer.length);
  88. onPacket(packetBuffer);
  89. packetBuffer = new byte[0];
  90. }
  91. }
  92. // System.out.println("--- Segment end ---");
  93. }
  94. }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement