現在、JMF を使用してビデオ (ウェブカメラ) とオーディオ (マイク) を録音しています。コーディングに問題はありませんでした。しかし、出力に関しては問題があります。映像と音声が完全にずれています。オーディオの後のビデオ フレームの開始の間には 1 秒の時間遅延があります。
以前にこの問題に遭遇した人はいますか?
以下は、ビデオをキャプチャするために使用したコードです。
MediaLocator videoMediaLocator = captureVideoDevice.getLocator();
DataSource videoDataSource = null;
try {
videoDataSource = javax.media.Manager.createDataSource(videoMediaLocator);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (NoDataSourceException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
MediaLocator audioMediaLocator = captureAudioDevice.getLocator();
DataSource audioDataSource = null;
try {
audioDataSource = javax.media.Manager.createDataSource(audioMediaLocator);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (NoDataSourceException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
DataSource mixedDataSource = null;
DataSource dArray[] = new DataSource[2];
dArray[0] = videoDataSource;
dArray[1] = audioDataSource;
try {
mixedDataSource = javax.media.Manager.createMergingDataSource(dArray);
} catch (IncompatibleSourceException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
FileTypeDescriptor outputType = new FileTypeDescriptor(FileTypeDescriptor.QUICKTIME);
Format outputFormat[] = new Format[2];
VideoFormat videoFormat = new VideoFormat(VideoFormat.MJPG);
outputFormat[0] = videoFormat;
outputFormat[1] = new AudioFormat(AudioFormat.IMA4, 44100, 16, 1);
ProcessorModel processorModel = new ProcessorModel(mixedDataSource, outputFormat, outputType);
Processor processor = null;
try {
processor = Manager.createRealizedProcessor(processorModel);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (NoProcessorException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (CannotRealizeException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
DataSource source = processor.getDataOutput();
TrackControl [] tracks = processor.getTrackControls();
Format format = tracks[0].getFormat();
float frameRate = ((VideoFormat)format).getFrameRate();
MediaLocator dest = new MediaLocator("file:c:\\test.mov");
DataSink dataSink = null;
try {
dataSink = Manager.createDataSink(source, dest);
} catch (NoDataSinkException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
try {
dataSink.open();
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (SecurityException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
try {
dataSink.start();
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
processor.start();
System.out.println("starting capturing ...");
try { Thread.currentThread().sleep(30000); } catch (InterruptedException ie) {}
System.out.println("... capturing done");
processor.stop();
processor.close();
dataSink.close();