1

Xuggler を使用して、Java Robot クラスからキャプチャした画像と TargetDataLine クラスから読み取ったサウンドを変換し、これをビデオにエンコードしています。次に、このビデオ データを (ヘッダーを書き込んだ後) http (Socket OutputStream) 経由でフラッシュ クライアントに http ストリーミングしようとしていますが、クライアント側で使用するバッファ値に関係なく、再生とスタッターが発生します (スムーズに再生されることはありません)。

ビデオのエンコード方法や、取得していないhttpソケットを介したデータの送信に関する何かに関係している可能性があるため、助けを求めてJavaコードを表示しています..

ByteArrayURLHandler ba = new ByteArrayURLHandler();
final IRational FRAME_RATE = IRational.make(30); 
final int SECONDS_TO_RUN_FOR = 20; 
final Robot robot = new Robot(); 
final Toolkit toolkit = Toolkit.getDefaultToolkit(); 
final Rectangle screenBounds = new Rectangle(toolkit.getScreenSize()); 
IMediaWriter writer;

writer = ToolFactory.makeWriter(
    XugglerIO.map( 
        XugglerIO.generateUniqueName(out, ".flv"), 
        out 
    )); 

writer.addListener(new MediaListenerAdapter() { 
    public void onAddStream(IAddStreamEvent event) { 
        event.getSource().getContainer().setInputBufferLength(1000);
        IStreamCoder coder = event.getSource().getContainer().getStream(event.getStreamIndex()).getStreamCoder();
        if (coder.getCodecType() == ICodec.Type.CODEC_TYPE_AUDIO) { 
            coder.setFlag(IStreamCoder.Flags.FLAG_QSCALE, false);   
            coder.setBitRate(32000); 
            System.out.println("onaddstream"+ coder.getPropertyNames().toString());
        } 
        if (coder.getCodecType() == ICodec.Type.CODEC_TYPE_VIDEO) { 
            // coder.setBitRate(64000); 
            // coder.setBitRateTolerance(64000); 
        } 
    } 
});

writer.addVideoStream(videoStreamIndex, videoStreamId, 1024, 768);
final int channelCount = 1;       

int audionumber =   writer.addAudioStream(audioStreamIndex, audioStreamId,1, 44100);
int bufferSize = (int)audioFormat.getSampleRate()   *audioFormat.getFrameSize();//*6;///6;
byte[] audioBuf;// = new byte[bufferSize]; 

int i = 0;

final int audioStreamIndex = 1;
final int audioStreamId = 1;
BufferedImage screen, bgrScreen;
long startTime = System.nanoTime();
while(keepGoing)
{ 

    audioBuf = new byte[bufferSize]; 
    i++;

    screen = robot.createScreenCapture(screenBounds); 

    bgrScreen = convertToType(screen, BufferedImage.TYPE_3BYTE_BGR); 
    long nanoTs = System.nanoTime()-startTime; 
    writer.encodeVideo(0, bgrScreen, nanoTs, TimeUnit.NANOSECONDS);
    audioBuf = new byte[line.available()];
    int nBytesRead = line.read(audioBuf, 0, audioBuf.length); 

    IBuffer iBuf = IBuffer.make(null, audioBuf, 0, nBytesRead);

    IAudioSamples smp = IAudioSamples.make(iBuf,1,IAudioSamples.Format.FMT_S16);
    if (smp == null) {
        return;
    }

    long numSample = audioBuf.length / smp.getSampleSize();

    smp.setComplete(true, numSample,(int)
    audioFormat.getSampleRate(), audioFormat.getChannels(),
    IAudioSamples.Format.FMT_S16, nanoTs/1000);

    writer.encodeAudio(1, smp);

    writer.flush();
}
4

0 に答える 0