Audio 我认为Xuggle录制视频和音频的采样问题。有什么想法吗?
我想一起录制视频和音频,并且已经有了很多方法,但是在视频播放之前音频播放有一个问题,可能长度不一样 部分解决自 我有一种感觉,我的问题是音频样本的长度,但我不知道如何最好地解决它;请你帮忙好吗?代码:Audio 我认为Xuggle录制视频和音频的采样问题。有什么想法吗?,audio,video,record,xuggle,Audio,Video,Record,Xuggle,我想一起录制视频和音频,并且已经有了很多方法,但是在视频播放之前音频播放有一个问题,可能长度不一样 部分解决自 我有一种感觉,我的问题是音频样本的长度,但我不知道如何最好地解决它;请你帮忙好吗?代码: import com.github.sarxos.webcam.Webcam; import com.github.sarxos.webcam.WebcamResolution; import com.xuggle.ferry.IBuffer; import java.awt.Dimension;
import com.github.sarxos.webcam.Webcam;
import com.github.sarxos.webcam.WebcamResolution;
import com.xuggle.ferry.IBuffer;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.io.File;
import com.xuggle.mediatool.IMediaWriter;
import com.xuggle.mediatool.MediaListenerAdapter;
import com.xuggle.mediatool.ToolFactory;
import com.xuggle.mediatool.event.IAddStreamEvent;
import com.xuggle.xuggler.IAudioSamples;
import com.xuggle.xuggler.IAudioSamples.Format;
import com.xuggle.xuggler.ICodec;
import com.xuggle.xuggler.IContainer;
import com.xuggle.xuggler.IPixelFormat;
import com.xuggle.xuggler.IRational;
import com.xuggle.xuggler.IStream;
import com.xuggle.xuggler.IStreamCoder;
import com.xuggle.xuggler.IVideoPicture;
import com.xuggle.xuggler.TestAudioSamplesGenerator;
import com.xuggle.xuggler.io.XugglerIO;
import com.xuggle.xuggler.video.ConverterFactory;
import com.xuggle.xuggler.video.IConverter;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.util.List;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.TargetDataLine;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Encoder {
public static int audioTime = 0;
public static long start = System.currentTimeMillis();
public static IMediaWriter writer;
public static void main(String[] args) throws Throwable {
JFrame window = new JFrame("vid");
window.setVisible(true);
File file = new File("output.mov");
List<Webcam> list = Webcam.getWebcams();
for (int i = 0; i < list.size(); i++) {
try {
Webcam cam = list.get(i);
System.out.println("Found this Camera : "+cam.getName());
BufferedImage image = cam.getImage();
} catch (Exception e) {
System.out.println("Exception in cam : " + i);
}
}
writer = ToolFactory.makeWriter(file.getName());
Dimension size = WebcamResolution.QVGA.getSize();
Webcam webcam = Webcam.getDefault();
webcam.setViewSize(size);
webcam.open(true);
writer.addVideoStream(0, 0, ICodec.ID.CODEC_ID_H264, size.width, size.height);
writer.addAudioStream(1, 0, ICodec.ID.CODEC_ID_AAC, 2, 44100);
long time = (System.currentTimeMillis() - start) * 1000;
for (int i = 0; i < 100; i++) {
System.out.println("Capture frame " + i);
BufferedImage image = ConverterFactory.convertToType(webcam.getImage(), BufferedImage.TYPE_3BYTE_BGR);
IConverter converter = ConverterFactory.createConverter(image, IPixelFormat.Type.YUV420P);
long len = (System.currentTimeMillis() - start) * 1000 - time;
time = (System.currentTimeMillis() - start) * 1000;
IVideoPicture frame = converter.toPicture(image, time);
frame.setKeyFrame(i == 0);
frame.setQuality(0);
writer.encodeVideo(0, frame);
IAudioSamples samples = customAudioStream(len);
writer.encodeAudio(1, samples);
window.setSize(200,200);
window.getContentPane().removeAll();
window.getContentPane().add(new JLabel(new ImageIcon(image)));
window.getContentPane().validate();
window.getContentPane().invalidate();
window.getContentPane().repaint();
// 10 FPS
Thread.sleep(0,500);
}
writer.close();
window.dispose();
System.out.println("Video recorded in file: " + file.getAbsolutePath());
}
public static IAudioSamples customAudioStream(long length){
// audio parameters
int channelCount = 2;
int sampleRate = 44100;
int len = (int)length/1000;
IContainer container = writer.getContainer();
IStream stream = container.getStream(1);
int sampleCount = stream.getStreamCoder().getDefaultAudioFrameSize();
// create a place for audio samples
IAudioSamples samples = IAudioSamples.make(1024*5, channelCount, IAudioSamples.Format.FMT_S16);
TargetDataLine line = null;
AudioFormat audioFormat = new AudioFormat(sampleRate, (int)16, channelCount, true, false);
DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioFormat);
try {
line = (TargetDataLine) AudioSystem.getLine(info);
line.open(audioFormat);
} catch (LineUnavailableException ex) {
System.out.println("ERROR: "+ex.toString());
}
line.start();
byte[] data = new byte[4096*5];
int sz = line.read(data, 0, data.length);
samples.put(data, 0, 0, sz);
audioTime += (sz);
double sAudioTime = (audioTime)/44.1000;
samples.setComplete(true, sz/4, sampleRate, channelCount, Format.FMT_S16, audioTime/4);
System.out.println(len + " : " + sampleCount + " : " + data.length + " : " + sz + " : " + audioTime + " : " + line.available());
return(samples);
}
}
导入com.github.sarxos.webcam.webcam;
导入com.github.sarxos.webcam.webcam分辨率;
进口com.xuggle.ferry.IBuffer;
导入java.awt.Dimension;
导入java.awt.image.buffereImage;
导入java.io.File;
导入com.xuggle.mediatool.IMediaWriter;
导入com.xuggle.mediatool.MediaListenerAdapter;
导入com.xuggle.mediatool.ToolFactory;
导入com.xuggle.mediatool.event.IAddStreamEvent;
导入com.xuggle.xuggler.IAudioSamples;
导入com.xuggle.xuggler.IAudioSamples.Format;
导入com.xuggle.xuggler.ICodec;
导入com.xuggle.xuggler.IContainer;
导入com.xuggle.xuggler.IPixelFormat;
导入com.xuggle.xuggler.IRational;
导入com.xuggle.xuggler.IStream;
导入com.xuggle.xuggler.IStreamCoder;
导入com.xuggle.xuggler.IVideoPicture;
导入com.xuggle.xuggler.TestAudioSamplesGenerator;
导入com.xuggle.xuggler.io.XugglerIO;
导入com.xuggle.xuggler.video.ConverterFactory;
导入com.xuggle.xuggler.video.IConverter;
导入java.awt.Rectangle;
导入java.awt.Toolkit;
导入java.util.List;
导入javax.sound.sampled.AudioFormat;
导入javax.sound.sampled.AudioSystem;
导入javax.sound.sampled.DataLine;
导入javax.sound.sampled.LineUnavailableException;
导入javax.sound.sampled.TargetDataLine;
导入javax.swing.Icon;
导入javax.swing.ImageIcon;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
公共类编码器{
公共静态int audioTime=0;
公共静态长启动=System.currentTimeMillis();
公共静态作者;
公共静态void main(字符串[]args)抛出可丢弃的{
JFrame窗口=新JFrame(“vid”);
window.setVisible(true);
File File=新文件(“output.mov”);
List List=Webcam.getwebcam();
对于(int i=0;i
如果有更好的办法,我也洗耳恭听。
谢谢
<