screen/mic capture xuggler

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts
  • Smelter
    Major Dude
    • Jan 2004
    • 1141

    screen/mic capture xuggler

    Several years late, but so what. Im enjoying myself.

    code:


    public class XugglerTest {

    private int audtioTime;
    private IContainer outContainer = null;
    private IRational frameRate = null;
    static private IStream audioStream = null;
    private IStreamCoder audioStreamCoder= null;
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();

    File toWrite ;

    private BufferedOutputStream output = null;

    XugglerTest(){
    try {
    output = new BufferedOutputStream(new FileOutputStream("audio.nsv"));
    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    openAudio();

    }

    private NSVStream nsv;
    private NSVStreamConfig config;
    private int numFrames = 0;
    private IStream outStream;
    private IStreamCoder outStreamCoder;
    private long firstTimeStamp=-1;



    public void openAudio(){

    Robot robot = null;
    try {
    robot = new Robot();
    } catch (AWTException e2) {
    e2.printStackTrace();
    }
    final Toolkit toolkit = Toolkit.getDefaultToolkit();

    final Rectangle screenBounds = new Rectangle(0,0,320,240);




    // Change this to change the frame rate you record at
    frameRate = IRational.make(44100,1);

    outContainer = IContainer.make();
    String outfile = "video.h264";
    int retval = outContainer.open(outfile, IContainer.Type.WRITE, null);
    if (retval < 0)
    throw new RuntimeException("could not open output file");

    ICodec audio = ICodec.guessEncodingCodec(null, null, "video.aac", null,
    ICodec.Type.CODEC_TYPE_AUDIO);
    if (audio == null)
    throw new RuntimeException("could not guess audio codec");


    audioStream = outContainer.addNewStream(audio);
    audioStreamCoder = audioStream.getStreamCoder();
    audioStreamCoder.setFrameRate(frameRate);
    audioStreamCoder.setSampleFormat(Format.FMT_S16);
    audioStreamCoder.setSampleRate(44100);
    audioStreamCoder.setBitRate(64000);
    audioStreamCoder.setChannels(2);
    retval=audioStreamCoder.open(null,null);
    if (retval < 0)
    throw new RuntimeException("could not open audio encder");


    outStream = outContainer.addNewStream(0);
    outStreamCoder = outStream.getStreamCoder();



    ICodec codec = ICodec.findEncodingCodec(ICodec.ID.CODEC_ID_H264);
    //outStreamCoder.setNumPicturesInGroupOfPictures(30);
    outStreamCoder.setCodec(codec);

    outStreamCoder.setBitRate(250000);
    outStreamCoder.setBitRateTolerance(50000);

    int width = screenBounds.width;
    int height = screenBounds.height;

    outStreamCoder.setPixelType(IPixelFormat.Type.YUV420P);
    outStreamCoder.setHeight(height);
    outStreamCoder.setWidth(width);

    IRational vRate = IRational.make(30);

    outStreamCoder.setFrameRate(vRate);
    IRational tBase = IRational.make(1,10000000);
    outStreamCoder.setTimeBase(tBase);

    retval = outStreamCoder.open();

    retval = outContainer.writeHeader();

    AudioFormat audioFormat = new AudioFormat(44100,
    (int)16,
    2,
    true, /* xuggler defaults to signed 16 bit samples */
    false);

    TargetDataLine line = null;
    DataLine.Info info = new DataLine.Info(TargetDataLine.class,
    audioFormat); // format is an AudioFormat object
    if (!AudioSystem.isLineSupported(info)) {
    return;

    }
    // Obtain and open the line.
    try {
    line = (TargetDataLine) AudioSystem.getLine(info);
    line.open(audioFormat);
    } catch (LineUnavailableException ex) {
    return;
    }

    // Begin audio capture.
    line.start();

    // Here, stopped is a global boolean set by another thread.
    while ( numFrames < 700) {

    // Read the next chunk of data from the TargetDataLine.
    byte[] data = new byte[4096];

    int sz = line.read(data, 0, data.length);
    if(sz>0){

    int samplesConsumed = 0;

    IAudioSamples pSamples=IAudioSamples.make(1024, 2);

    pSamples.put(data, 0, 0, sz);


    audtioTime += (sz);//total bytes.
    System.out.println("number of capture "+sz);

    double sAudioTime = (audtioTime/4)/44.1000;


    pSamples.setComplete(true, sz/4, 44100, 2, Format.FMT_S16, audtioTime/4);

    while(samplesConsumed<pSamples.getNumSamples()){

    IPacket packet= IPacket.make();

    samplesConsumed += audioStreamCoder.encodeAudio(packet, pSamples, samplesConsumed);

    System.out.println("samples Consumed "+samplesConsumed);


    if (packet.isComplete()){

    System.out.println("packet complete ");


    int frameLength=packet.getSize();

    byte fData[]=new byte[frameLength];

    packet.get(0, fData, 0, frameLength);

    try {

    buffer.write(fData);
    buffer.flush();
    System.out.println("buffer writen");
    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }


    if(this.nsv==null){
    System.out.println("make nsv stream "+new String(audioStreamCoder.getCodecTagArray()));
    config = NSVStream.create("H264", "AAC ", 320, 240, 30.0);
    nsv = NSVStream.create(config);

    }

    long delta = System.currentTimeMillis() - nsv.config.start_time;

    System.out.println("sAudioTime "+sAudioTime+ " s " + ((1000.0/nsv.config.frame_rate) * nsv.config.total_frames ) );
    if( ((1000.0/nsv.config.frame_rate)) * ( (double)nsv.config.total_frames) < sAudioTime ){

    System.out.println("frame");

    BufferedImage screen = robot.createScreenCapture(screenBounds);
    // convert to the right image type
    BufferedImage bgrScreen = convertToType(screen, BufferedImage.TYPE_3BYTE_BGR);
    IPacket p = encodeImage(bgrScreen);




    NSVFrame newFrame = NSVStream.initiate(nsv, NSVStream.NSV_SYNC_DWORD);
    byte vBUf[]= null;

    if(p!=null){
    System.out.println(" v packet");
    vBUf= new byte[p.getSize()];
    p.get(0, vBUf,0,vBUf.length);
    p.delete();
    }
    if(vBUf!=null){


    newFrame.vid_len=vBUf.length;
    newFrame.vid_data = vBUf;
    }

    byte cRaw[]=buffer.toByteArray();

    if(cRaw.length>0){
    buffer.reset();
    newFrame.aud_len=cRaw.length;
    newFrame.aud_data = cRaw;
    }
    nsv.config.total_frames++;

    numFrames++;

    if(output!=null){

    try {
    output.write(newFrame.toBitStream());
    output.flush();
    } catch (IOException e) {

    e.printStackTrace();
    }
    }
    }
    outContainer.writePacket(packet);
    }
    packet.delete();
    }
    pSamples.delete();
    }
    }
    //uVox.close();
    try {
    output.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    public IPacket encodeImage(BufferedImage originalImage)
    {
    BufferedImage worksWithXugglerBufferedImage = convertToType(originalImage,
    BufferedImage.TYPE_3BYTE_BGR);
    IPacket packet = IPacket.make();

    long now = System.currentTimeMillis();
    if (firstTimeStamp == -1)
    firstTimeStamp = now;

    IConverter converter = null;
    try
    {
    converter = ConverterFactory.createConverter(
    worksWithXugglerBufferedImage, IPixelFormat.Type.YUV420P);
    }
    catch (UnsupportedOperationException e)
    {
    System.out.println(e.getMessage());
    e.printStackTrace(System.out);
    }

    long timeStamp = (now - firstTimeStamp) * 1000; // convert to microseconds

    IVideoPicture outFrame = converter.toPicture(worksWithXugglerBufferedImage, timeStamp);

    outFrame.setQuality(0);

    int retval = outStreamCoder.encodeVideo(packet, outFrame, 0);

    if (retval < 0)
    return null;
    if (packet.isComplete()){
    return packet;
    }
    packet.delete();
    return null;
    }
    public static BufferedImage convertToType(BufferedImage sourceImage,
    int targetType)
    {
    BufferedImage image;

    // if the source image is already the target type, return the source image

    if (sourceImage.getType() == targetType)
    image = sourceImage;

    // otherwise create a new image of the target type and draw the new
    // image

    else
    {
    image = new BufferedImage(sourceImage.getWidth(),
    sourceImage.getHeight(), targetType);
    image.getGraphics().drawImage(sourceImage, 0, 0, null);
    }

    return image;
    }

    /**
    * @param args
    * @throws AWTException
    */
    public static void main(String[] args) throws AWTException {

    XugglerTest xt = new XugglerTest();
    }

    }



Working...
X