- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 Xuggler (我相信在后台使用 ffmpeg
)执行以下操作:
我已经观看/阅读了他们的一些优秀教程,到目前为止,我得到的是:
// I'll worry about implementing this functionality later, but
// involves querying native device drivers.
byte[] nextMjpeg = getNextMjpegFromSerialPort();
// I'll also worry about implementing this functionality as well;
// I'm simply providing these for thoroughness.
BufferedImage mjpeg = MjpegFactory.newMjpeg(nextMjpeg);
// Specify a h.264 video stream (how?)
String h264Stream = "???";
IMediaWriter writer = ToolFactory.makeWriter(h264Stream);
writer.addVideoStream(0, 0, ICodec.ID.CODEC_ID_H264);
writer.encodeVideo(0, mjpeg);
一方面,我认为我在这里很接近,但仍然不正确;我只是通过阅读视频代码示例(不是音频 - 我找不到任何好的音频示例)才走到这一步。
从字面上看,我将获得对进入我的 Xuggler 实现的原始视频和音频源的字节级访问。但对于我的生活,我无法弄清楚如何将它们转换为 h.264/AAC/MPEG-TS 格式。在此先感谢您的帮助。
最佳答案
查看Xuggler this sample code , 以下代码应该可以将视频编码为 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);
}
根据文件扩展名猜测容器类型,明确指定编解码器。
要混合音频和视频,您可以这样做:
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(),具体取决于哪些数据可用(一大块音频样本或视频帧)有一个较早的时间戳。
您可能最终会使用另一个较低级别的 API,它基于 IStreamCoder ,它可以更好地控制各种参数。我认为您不需要使用它。
回答您提出的具体问题:
(1)“将 BufferedImage (M/JPEG) 编码为 h.264 流”- 您已经知道了,writer.addVideoStream(..., ICodec.ID.CODEC_ID_H264)
确保您获得 H.264 编解码器。要获取传输流 (MPEG2 TS) 容器,只需使用扩展名为 .ts 的文件名调用 makeWriter()
。
(2) “找出原始音频馈送的“BufferedImage-equivalent”是什么”- short[] 或 IAudioSamples对象(两者似乎都有效,但 IAudioSamples 必须从 IBuffer 构造,这要简单得多)。
(3)“将此音频类编码为 AAC 音频流”——调用 writer.addAudioStream(..., ICodec.ID.CODEC_ID_AAC, channelCount, sampleRate)
(4)“将两个流复用到同一个 MPEG-TS 容器中”- 使用 .ts 文件名调用 makeWriter()
,这会设置容器类型。为了正确的音频/视频同步,您可能需要以正确的顺序调用 encodeVideo()/encodeAudio()。
附言始终首先传递最早可用的音频/视频。例如,如果您的音频 block 长度为 440 个样本(44000 Hz 采样率,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
...等等
只要连续的音频/视频时间戳相对接近,大多数播放设备可能都可以处理流,但这是您为完美的多路复用所做的。
附言您可能需要引用一些文档:Xuggler class diagram , ToolFactory , IMediaWriter , ICodec .
关于java - Xuggler 编码和混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13839850/
我正在尝试使用 xuggler 从视频文件(.avi、*.mp4 等)制作音频文件(*.mp3、.wav 等),这是我的代码 Code: IMediaReader reader = ToolFacto
香港专业教育学院试图将视频转换为一个android设备的.mp3文件。 因此,经过长时间的搜索和搜索(不知道其分别的拼写是否如此),我找到了Xuggler。 它是最好的解决方案,因为我自己不能移植ff
我在我的应用程序中使用了 xuggle-xuggler5.4 来添加视频和音频播放功能,我已经深入谷歌并找到以下片段: long duration = container.getDuration();
我在我的 tomcat 环境中成功引入了 xuggle 并且它运行良好。然后发生了一些事情,从那一刻起,每当我的缩略图生成器被调用时(是使用 xuggle 最多的类)我得到了*java.lang.Un
我没有找到适用于 WINDOWS 或 LINUX 平台的预编译二进制文件,我正在尝试构建从 github 克隆的 Xuggler 代码库。我正在按照链接中给出的步骤操作:http://www.xugg
我有一份工作,我必须连续截屏并从桌面捕获声音,然后将它们发布为实时视频流。我使用 Wowza Media Server 3.0.3 进行流媒体发布。我还使用 Xuggler 生成图像帧并将它们与声音缓
我通过编码 BufferedImages 创建视频文件。如何将音频从 mp3 文件添加到此视频? IMediaWriter movie = ToolFactory.makeWriter("somefi
我正在致力于创建我的第一个 Xuggler 媒体应用程序。我通过观看他们关于如何创建第一个媒体应用程序的视频进行编码。 代码 package demo; import com.xuggle.xuggl
我想使用 Xuggler 将没有音频的视频文件 (flv) 与音频文件 (mp3) 合并。目前,我已经拍摄了两个流,并将这些流的视频和音频部分分别组合起来,就像画中画一样。现在我想将音频和视频文件相互
我使用 xuggler 但不明白。我有 ArrayList,我想用这些图像、视频制作。但是当我编译这段代码时,视频图像的前 5 秒没有改变,视频的最后 5 秒根本没有改变。怎么解决。 public c
我正在尝试使用以下教程制作一个简单的媒体播放器: http://www.youtube.com/watch?v=9aJvPPzhyik 首先,我将解释一下我到目前为止所做的事情,我在没有使用 Apac
我正在使用 Java 中的 Xuggler 库将视频转换为音频。程序中没有出现错误或异常,但生成的音频文件为 0 Kb。有人可以解决这个问题吗? 环境:Eclipse Helios,操作系统:Wind
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我有一个 mp4 视频,我必须使用 java xuggler 从视频中提取特定帧的缩略图。 我怎样才能做到这一点? 最佳答案 https://github.com/artclarke/xuggle-x
我现在下载了 Xuggler 并试用了它。有些例子有效,有些则无效。演示文件中没有包含服务器和客户端的视频直播示例。有没有人已经建立了 Xuggler 视频直播并可以告诉我如何做,甚至发布服务器和客户
在我的 JAVA 应用程序中,我将 Xuggler 用于 ScreenCapture 和其他功能。现在它是一个 Maven 项目,所以我将 Xuggler 作为 Pom.xml 中的依赖项,如 Lin
要使用 Xuggler,您需要 xuggle-xuggler-5.4.jar。据做这个的人说,大多数用户只需要上面提到的JAR文件。然而,这就是他们关于使用 Xuggler 没有 Maven 或 Iv
我们目前正忙于一个项目,在该项目中,我们试图在一个窗口中播放来自 Java 实时流的视频文件。我们已经设法使用 InputStreamReader 通过 Socket 对象捕获流。 下一步是使用现有库
我正在尝试安装 Xuggler。为了安装它们,我应该先下载它们。于是,我去了他们的下载页面。http://www.xuggle.com/downloads 没有下载 .jar 文件的下载链接。但是一些
是的,我知道 FAQ假装回答这个问题,但事实并非如此。相反,它指示您从源代码构建项目(并且构建说明非常复杂)。那种打败了整个观点:) 让世界上的每个人都不必再构建另一个开源项目来确定它是否真正解决了他
我是一名优秀的程序员,十分优秀!