焯
This commit is contained in:
parent
d9e7a9269b
commit
6c51273c6e
@ -12,5 +12,6 @@
|
|||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
|
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
|
||||||
<orderEntry type="library" name="jetbrains.kotlinx.coroutines.core" level="project" />
|
<orderEntry type="library" name="jetbrains.kotlinx.coroutines.core" level="project" />
|
||||||
|
<orderEntry type="library" name="io.github.jaredmdobson.concentus" level="project" />
|
||||||
</component>
|
</component>
|
||||||
</module>
|
</module>
|
@ -26,7 +26,6 @@ var `in`: InputStream? = null
|
|||||||
var out: OutputStream? = null
|
var out: OutputStream? = null
|
||||||
|
|
||||||
|
|
||||||
var file = Files.newOutputStream(Path.of("./a.pcm"))
|
|
||||||
|
|
||||||
object Client {
|
object Client {
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@ -73,8 +72,6 @@ fun mainClient() = runBlocking {
|
|||||||
}
|
}
|
||||||
|
|
||||||
`in`!!.read(bufferIn, 0, bufferIn.size)
|
`in`!!.read(bufferIn, 0, bufferIn.size)
|
||||||
file.write(bufferIn, 0, bufferIn.size)
|
|
||||||
file.flush()
|
|
||||||
sourceDataLine.write(bufferIn, 0, bufferIn.size)
|
sourceDataLine.write(bufferIn, 0, bufferIn.size)
|
||||||
} catch (e: IOException) {
|
} catch (e: IOException) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
|
118
src/Program.java
Normal file
118
src/Program.java
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
import io.github.jaredmdobson.concentus.*;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lostromb
|
||||||
|
*/
|
||||||
|
public class Program {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param args the command line arguments
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) {
|
||||||
|
test();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void test() {
|
||||||
|
try {
|
||||||
|
FileInputStream fileIn = new FileInputStream("a.pcm");
|
||||||
|
OpusEncoder encoder = new OpusEncoder(48000, 1, OpusApplication.OPUS_APPLICATION_AUDIO);
|
||||||
|
encoder.setBitrate(96000);
|
||||||
|
encoder.setForceMode(OpusMode.MODE_CELT_ONLY);
|
||||||
|
encoder.setSignalType(OpusSignal.OPUS_SIGNAL_MUSIC);
|
||||||
|
encoder.setComplexity(0);
|
||||||
|
|
||||||
|
OpusDecoder decoder = new OpusDecoder(48000, 1);
|
||||||
|
|
||||||
|
FileOutputStream fileOut = new FileOutputStream("b.pcm");
|
||||||
|
int packetSamples = 960;
|
||||||
|
byte[] inBuf = new byte[packetSamples * 2 * 2];
|
||||||
|
byte[] data_packet = new byte[1275];
|
||||||
|
long start = System.currentTimeMillis();
|
||||||
|
long size = 0;
|
||||||
|
while (fileIn.available() >= inBuf.length) {
|
||||||
|
int bytesRead = fileIn.read(inBuf, 0, inBuf.length);
|
||||||
|
short[] pcm = BytesToShorts(inBuf, 0, inBuf.length);
|
||||||
|
int bytesEncoded = encoder.encode(pcm, 0, packetSamples, data_packet, 0, 1275);
|
||||||
|
//System.out.println(bytesEncoded + " bytes encoded");
|
||||||
|
|
||||||
|
size += bytesEncoded;
|
||||||
|
|
||||||
|
int samplesDecoded = decoder.decode(data_packet, 0, bytesEncoded, pcm, 0, packetSamples, false);
|
||||||
|
//System.out.println(samplesDecoded + " samples decoded");
|
||||||
|
byte[] bytesOut = ShortsToBytes(pcm);
|
||||||
|
fileOut.write(bytesOut, 0, bytesOut.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
long end = System.currentTimeMillis();
|
||||||
|
System.out.println("Time was " + (end - start) + "ms");
|
||||||
|
fileIn.close();
|
||||||
|
fileOut.close();
|
||||||
|
System.out.println("Done!");
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
} catch (OpusException e) {
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Converts interleaved byte samples (such as what you get from a capture device)
|
||||||
|
/// into linear short samples (that are much easier to work with)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static short[] BytesToShorts(byte[] input) {
|
||||||
|
return BytesToShorts(input, 0, input.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Converts interleaved byte samples (such as what you get from a capture device)
|
||||||
|
/// into linear short samples (that are much easier to work with)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static short[] BytesToShorts(byte[] input, int offset, int length) {
|
||||||
|
short[] processedValues = new short[length / 2];
|
||||||
|
for (int c = 0; c < processedValues.length; c++) {
|
||||||
|
short a = (short) (((int) input[(c * 2) + offset]) & 0xFF);
|
||||||
|
short b = (short) (((int) input[(c * 2) + 1 + offset]) << 8);
|
||||||
|
processedValues[c] = (short) (a | b);
|
||||||
|
}
|
||||||
|
|
||||||
|
return processedValues;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Converts linear short samples into interleaved byte samples, for writing to a file, waveout device, etc.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static byte[] ShortsToBytes(short[] input) {
|
||||||
|
return ShortsToBytes(input, 0, input.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Converts linear short samples into interleaved byte samples, for writing to a file, waveout device, etc.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static byte[] ShortsToBytes(short[] input, int offset, int length) {
|
||||||
|
byte[] processedValues = new byte[length * 2];
|
||||||
|
for (int c = 0; c < length; c++) {
|
||||||
|
processedValues[c * 2] = (byte) (input[c + offset] & 0xFF);
|
||||||
|
processedValues[c * 2 + 1] = (byte) ((input[c + offset] >> 8) & 0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
return processedValues;
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user