Xuggler没有转换.webm文件?
我正在尝试使用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
。
我花了一段时间才弄明白这一点。 尽管他的代码现已过时,但Marty的这篇文章帮了很多忙。
这是你如何解决它。
。
在编码之前
我假设音频输入已正确设置,导致IStreamCoder
称为audioCoder
。
完成之后,您可能正在启动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);
。
最后的想法
只是提示您的输出文件能够很好地发挥作用:
- 如果您在同一容器中使用音频和video,则应按照每个数据包的时间戳高于先前数据包的时间戳的顺序写入音频和video数据包。 因此,您几乎肯定需要某种缓冲机制来交替编写音频和video。