来看,以下应该工作对视频编码,H.264和混流它变成一个MPEG2TS容器:
IMediaWriter writer = ToolFactory.makeWriter("output.ts");
writer.addVideoStream(0, 0, ICodec.ID.CODEC_ID_H264, width, height);
for (...)
{
BufferedImage mjpeg = ...;
writer.encodeVideo(0, mjpeg);
}
容器类型从文件扩展名猜测,该编解码器明确指定。
于MUX音频和视频,你会做这样的事情:
writer.addVideoStream(videoStreamIndex, 0, videoCodec, width, height);
writer.addAudioStream(audioStreamIndex, 0, audioCodec, channelCount, sampleRate);
while (... have more data ...)
{
BufferedImage videoFrame = ...;
long videoFrameTime = ...; // this is the time to display this frame
writer.encodeVideo(videoStreamIndex, videoFrame, videoFrameTime, DEFAULT_TIME_UNIT);
short[] audioSamples = ...; // the size of this array should be number of samples * channelCount
long audioSamplesTime = ...; // this is the time to play back this bit of audio
writer.encodeAudio(audioStreamIndex, audioSamples, audioSamplesTime, DEFAULT_TIME_UNIT);
}
在这种情况下,我相信你的代码负责交错的音频和视频:您要拨打任一encodeAudio()或 encodeVideo()在每次通过循环时,基于哪个数据可用(一个音频样本或一个视频帧)具有较早的时间戳。
根据IStreamCoder,您可能最终会使用另一个较低级别的API,它可以更好地控制各种参数。我认为你不需要使用它。
要回答你问的具体问题:
(1) “编码的BufferedImage(M/JPEG)成H.264流” - 你已经想通了这一点,writer.addVideoStream(..., ICodec.ID.CODEC_ID_H264)
可以确保得到的H. 264 编解码器。为了得到一个传输流(MPEG2-TS)容器,只需调用makeWriter()
带有一个扩展的.ts文件名。 (2)“找出原始音频馈送的”BufferedImage-equivalent“是什么” - 这是一个short []或者一个IAudioSamples对象(两者似乎都可以工作,但是IAudioSamples必须从IBuffer不那么简单)。
(3) “编码该音频类成AAC音频流” - 呼叫writer.addAudioStream(..., ICodec.ID.CODEC_ID_AAC, channelCount, sampleRate)
(4) “复用两个流到相同的MPEG-TS的容器” - 呼叫makeWriter()
用的.ts文件名,其设置容器类型。要获得正确的音频/视频同步,您可能需要按正确的顺序调用encodeVideo()/ encodeAudio()。
P.S.总是先传递最早的音频/视频。例如,如果有音频块,其是440个样本长(在44000赫兹的采样速率,四万四千分之四百四十零= 0.01秒),视频在完全相同25fps的(1/25 =0.04秒),则会给他们到写入在这个顺序:
video0 @ 0.00 sec
audio0 @ 0.00 sec
audio1 @ 0.01 sec
audio2 @ 0.02 sec
audio3 @ 0.03 sec
video1 @ 0.04 sec
audio4 @ 0.04 sec
audio5 @ 0.05 sec
...等等
大多数播放设备可能是确定随大流,只要连续的音频/视频时间戳都比较接近,但是这是你会怎么做为一个完美的复合。
P.S.另外,您可能需要参考一些文档:Xuggler class diagram,ToolFactory,IMediaWriter,ICodec。
我也有,我不是“嫁”给Xuggler赏金文中提到。如果有人能想出如何做,说,'ffmpeg'或其他工具的一切,我需要(赏金规定),可以运行在Linux上,我会很感兴趣的是解决方案,以及! – IAmYourFaja
你可以通过USB连接相机吗?你知道xuggle是否可以通过SPI从你的摄像头读取输入 – rajneesh
在USB和SPI上是的,但是我不会因为这个问题范围之外的原因而使用这个选项。唯一真正重要的是我将以'byte []'的形式获取原始音频和视频比特流。 – IAmYourFaja