gpt4 book ai didi

JAVA - Xuggler - 结合 MP3 音频文件和 MP4 电影

转载 作者:行者123 更新时间:2023-11-30 11:26:26 26 4
gpt4 key购买 nike

使用 JAVA 和 Xuggler - 以下代码组合了一个 MP3 音频文件和一个 MP4 电影文件,并输出了一个组合的 mp4 文件。

我希望输出视频的持续时间等于输入视频文件的持续时间

如果我将循环条件设置为:

while (containerVideo.readNextPacket(packetvideo) >= 0) 

它提供 400 次迭代 - 使电影运行 15 秒。完全符合我的要求。

但由于某种原因,音频在 10 秒后被切断 - 使电影的最后 5 秒无声。

看起来视频 IStreamCoder 的单次迭代的持续时间与音频 IStreamCoder 的单次迭代的持续时间不同。

如何让声音充满电影的整个 15 秒?

    String inputVideoFilePath = "in.mp4";
String inputAudioFilePath = "in.mp3";
String outputVideoFilePath = "out.mp4";

IMediaWriter mWriter = ToolFactory.makeWriter(outputVideoFilePath);

IContainer containerVideo = IContainer.make();
IContainer containerAudio = IContainer.make();

// check files are readable
if (containerVideo.open(inputVideoFilePath, IContainer.Type.READ, null) < 0)
throw new IllegalArgumentException("Cant find " + inputVideoFilePath);
if (containerAudio.open(inputAudioFilePath, IContainer.Type.READ, null) < 0)
throw new IllegalArgumentException("Cant find " + inputAudioFilePath);

// read video file and create stream
IStreamCoder coderVideo = containerVideo.getStream(0).getStreamCoder();
if (coderVideo.open(null, null) < 0)
throw new RuntimeException("Cant open video coder");
IPacket packetvideo = IPacket.make();
int width = coderVideo.getWidth();
int height = coderVideo.getHeight();

// read audio file and create stream
IStreamCoder coderAudio = containerAudio.getStream(0).getStreamCoder();
if (coderAudio.open(null, null) < 0)
throw new RuntimeException("Cant open audio coder");
IPacket packetaudio = IPacket.make();

mWriter.addAudioStream(1, 0, coderAudio.getChannels(), coderAudio.getSampleRate());
mWriter.addVideoStream(0, 0, width, height);

while (containerVideo.readNextPacket(packetvideo) >= 0) {

containerAudio.readNextPacket(packetaudio);

// video packet
IVideoPicture picture = IVideoPicture.make(coderVideo.getPixelType(), width, height);
coderVideo.decodeVideo(picture, packetvideo, 0);
if (picture.isComplete())
mWriter.encodeVideo(0, picture);

// audio packet
IAudioSamples samples = IAudioSamples.make(512, coderAudio.getChannels(), IAudioSamples.Format.FMT_S32);
coderAudio.decodeAudio(samples, packetaudio, 0);
if (samples.isComplete())
mWriter.encodeAudio(1, samples);

}

coderAudio.close();
coderVideo.close();
containerAudio.close();
containerVideo.close();
mWriter.close();

最佳答案

不错的代码。谢谢。要捕获剩余的音频,请在末尾添加一个循环以读取音频数据包,直到没有更多为止。

    while (samples.isComplete() ) {
containerAudio.readNextPacket(packetaudio);
coderAudio.decodeAudio(samples, packetaudio, 0);
writer.encodeAudio(iAudioStream, samples);
Utility.console(String.format("%s %d", Utility.timeStamp(),
samples.getPts() ));
}

关于JAVA - Xuggler - 结合 MP3 音频文件和 MP4 电影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19812480/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com