TargetDataLine
これまでのところ、Java でマイク入力をキャプチャする最も簡単な方法です。ユーザーがチュートリアル、スライドケースなどを作成できるように、[スクリーンレコーダーソフトウェアで]画面のビデオでキャプチャしたオーディオをエンコードしたいです。ビデオのエンコード
に使用Xuggler
します。ビデオでオーディオをエンコードするチュートリアルがあり
ますが、ファイルからオーディオを取得します。私の場合、オーディオはライブです。
私が使用するビデオをエンコードするには
com.xuggle.mediaTool.IMediaWriter
. IMediaWriter オブジェクトを使用すると、ビデオ ストリームを追加できます。encodeAudio(int streamIndex, short[] samples, long timeStamp, TimeUnit timeUnit)
ターゲット データ行からサンプルを として取得できれば、それを使用できます
short[]
。戻るbyte[]
したがって、2つの質問は次のとおりです。
ビデオでライブオーディオをエンコードするにはどうすればよいですか?
適切なタイミングでエンコードされるように、オーディオ パケットの適切なタイミングを維持するにはどうすればよいですか?
参照:
1. TargetDataLine の DavaDoc: http://docs.oracle.com/javase/1.4.2/docs/api/javax/sound/sampled/TargetDataLine.html
2. Xuggler ドキュメント: http://build.xuggle。 com/view/Stable/job/xuggler_jdk5_stable/javadoc/java/api/index.html
アップデート
ビデオをキャプチャするための私のコード
public void run(){
final IRational FRAME_RATE = IRational.make(frameRate, 1);
final IMediaWriter writer = ToolFactory.makeWriter(completeFileName);
writer.addVideoStream(0, 0,FRAME_RATE, recordingArea.width, recordingArea.height);
long startTime = System.nanoTime();
while(keepCapturing==true){
image = bot.createScreenCapture(recordingArea);
PointerInfo pointerInfo = MouseInfo.getPointerInfo();
Point globalPosition = pointerInfo.getLocation();
int relativeX = globalPosition.x - recordingArea.x;
int relativeY = globalPosition.y - recordingArea.y;
BufferedImage bgr = convertToType(image,BufferedImage.TYPE_3BYTE_BGR);
if(cursor!=null){
bgr.getGraphics().drawImage(((ImageIcon)cursor).getImage(), relativeX,relativeY,null);
}
try{
writer.encodeVideo(0,bgr,System.nanoTime()-startTime,TimeUnit.NANOSECONDS);
}catch(Exception e){
writer.close();
JOptionPane.showMessageDialog(null,
"Recording will stop abruptly because" +
"an error has occured", "Error",JOptionPane.ERROR_MESSAGE,null);
}
try{
sleep(sleepTime);
}catch(InterruptedException e){
e.printStackTrace();
}
}
writer.close();
}