gpt4 book ai didi

java - Xuggler 不转换 .webm 文件?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:29:30 27 4
gpt4 key购买 nike

我只是尝试使用 Xuggler 将 .mov 文件转换为 .webm,这应该可以工作,因为 FFMPEG 支持 .webm 文件。

这是我的代码:

    IMediaReader reader = ToolFactory.makeReader("/home/user/vids/2.mov");
reader.addListener(ToolFactory.makeWriter("/home/user/vids/2.webm", reader));
while (reader.readPacket() == null);
System.out.println( "Finished" );

运行时,我得到这个错误:

[main] ERROR org.ffmpeg - [libvorbis @ 0x8d7fafe0] Specified sample_fmt is not supported.
[main] WARN com.xuggle.xuggler - Error: could not open codec (../../../../../../../csrc/com/xuggle/xuggler/StreamCoder.cpp:831)
Exception in thread "main" java.lang.RuntimeException: could not open stream com.xuggle.xuggler.IStream@-1921013728[index:1;id:0;streamcoder:com.xuggle.xuggler.IStreamCoder@-1921010088[codec=com.xuggle.xuggler.ICodec@-1921010232[type=CODEC_TYPE_AUDIO;id=CODEC_ID_VORBIS;name=libvorbis;];time base=1/44100;frame rate=0/0;sample rate=44100;channels=1;];framerate:0/0;timebase:1/90000;direction:OUTBOUND;]: Operation not permitted
at com.xuggle.mediatool.MediaWriter.openStream(MediaWriter.java:1192)
at com.xuggle.mediatool.MediaWriter.getStream(MediaWriter.java:1052)
at com.xuggle.mediatool.MediaWriter.encodeAudio(MediaWriter.java:830)
at com.xuggle.mediatool.MediaWriter.onAudioSamples(MediaWriter.java:1441)
at com.xuggle.mediatool.AMediaToolMixin.onAudioSamples(AMediaToolMixin.java:89)
at com.xuggle.mediatool.MediaReader.dispatchAudioSamples(MediaReader.java:628)
at com.xuggle.mediatool.MediaReader.decodeAudio(MediaReader.java:555)
at com.xuggle.mediatool.MediaReader.readPacket(MediaReader.java:469)
at com.mycompany.xugglertest.App.main(App.java:13)
Java Result: 1

有什么想法吗?

最佳答案

Xuggler 发生了一件奇怪的事情,它并不总是允许您设置 IAudioSamples 的采样率。您需要使用 IAudioResampler

我花了一段时间才弄明白这一点。 This post by Marty帮助很大,尽管他的代码现在已经过时了。

这里是你如何修复它。

.

编码前

我在这里假设音频输入已正确设置,生成一个名为 audioCoderIStreamCoder

完成后,您可能会启动一个 IMediaWriter 并像这样添加一个音频流:

final IMediaWriter oggWriter = ToolFactory.makeWriter(oggOutputFile);

// Using stream 1 'cause there is also a video stream.
// For an audio only file you should use stream 0.
oggWriter.addAudioStream(1, 1, ICodec.ID.CODEC_ID_VORBIS,
audioCoder.getChannels(), audioCoder.getSampleRate());

现在创建一个 IAudioResampler:

IAudioResampler oggResampler = IAudioResampler.make(audioCoder.getChannels(), 
audioCoder.getChannels(),
audioCoder.getSampleRate(),
audioCoder.getSampleRate(),
IAudioSamples.Format.FMT_FLT,
audioCoder.getSampleFormat());

并告诉您的 IMediaWriter 更新到它的示例格式:

// The stream 1 here is consistent with the stream we added earlier.
oggWriter.getContainer().getStream(1).getStreamCoder().
setSampleFormat(IAudioSamples.Format.FMT_FLT);

.

编码期间

您目前可能正在启动一个 IAudioSamples 并用音频数据填充它,如下所示:

IAudioSamples audioSample = IAudioSamples.make(512, audioCoder.getChannels(), 
audioCoder.getSampleFormat());

int bytesDecoded = audioCoder.decodeAudio(audioSample, packet, offset);

现在为我们的重采样数据启动一个IAudioSamples:

IAudioSamples vorbisSample = IAudioSamples.make(512, audioCoder.getChannels(),
IAudioSamples.Format.FMT_FLT);

最后对音频数据进行重采样并写入结果:

oggResampler.resample(vorbisSample, audioSample, 0);

oggWriter.encodeAudio(1, vorbisSample);

.

最后的想法

让您的输出文件正常播放的提示:

  • 如果在同一个容器中使用音频和视频,那么音频和视频数据包的写入顺序应该是每个数据包的时间戳都比前一个数据包的时间戳高。因此,您几乎肯定需要某种缓冲机制来交替写入音频和视频。

关于java - Xuggler 不转换 .webm 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16291843/

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