【问题标题】:Deciphering Xuggle/ffmpeg errors (newbie)解密 Xuggle/ffmpeg 错误(新手)
【发布时间】:2026-01-08 21:00:02
【问题描述】:

我最近开始使用 Xuggle 将各种格式的视频文件转换为相应的 FLV(通过 jwplayer 在我们的网站上播放)。我使用的代码非常简单;基本上是他们在基本视频转换教程中展示的内容:

IMediaReader reader = ToolFactory.makeReader(file.getPath());
reader.addListener(ToolFactory.makeWriter(tempFileName, reader));

while (reader.readPacket() == null)
;

这适用于我尝试过的大约 50% 的视频。但是,对于某些视频(我遇到的所有 .MP4 以及一些 .MOV)出现以下错误

Caused by: java.lang.RuntimeException: Error Operation not permitted, failed to write header to container com.xuggle.xuggler.IContainer@-635072136[url:/tmp/1280786368521.flv;type:WRITE;format:com.xuggle.xuggler.IContainerFormat@-631842520[oname:flv;olongname:FLV format;omimetype:video/x-flv;oextensions:flv;];] while establishing stream com.xuggle.xuggler.IStream@-615272544[index:1;id:2;streamcoder:com.xuggle.xuggler.IStreamCoder@-677475184[codec=com.xuggle.xuggler.ICodec@-635131032[type=CODEC_TYPE_AUDIO;id=CODEC_ID_MP3;name=libmp3lame;];time base=1/48000;frame rate=0/0;sample rate=48000;channels=2;];framerate:0/0;timebase:1/90000;direction:OUTBOUND;]
        at com.xuggle.mediatool.MediaWriter.getStream(MediaWriter.java:1065)
        at com.xuggle.mediatool.MediaWriter.encodeAudio(MediaWriter.java:837)
        at com.xuggle.mediatool.MediaWriter.onAudioSamples(MediaWriter.java:1448)
        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)
        ... 10 more

我很难确定错误的根本原因是否与 Xuggle/ffmpeg/lame/etc 相关。安装,或者我的代码是否有问题。

我认为第一步是破译错误日志并使用该信息尝试使用本机 ffmpeg 调用转换视频。如果这样可行,我认为有理由相信这些组件已正确安装?

所以对于像这样的日志消息:

Error Operation not permitted, failed to write header to container com.xuggle.xuggler.IContainer@-635072136
[url:/tmp/1280786368521.flv;type:WRITE;format:com.xuggle.xuggler.IContainerFormat@-631842520[oname:flv;olongname:FLV format;omimetype:video/x-flv;oextensions:flv;];] 

while establishing stream com.xuggle.xuggler.IStream@-615272544
[index:1;id:2;streamcoder:com.xuggle.xuggler.IStreamCoder@-677475184[codec=com.xuggle.xuggler.ICodec@-635131032[type=CODEC_TYPE_AUDIO;id=CODEC_ID_MP3;name=libmp3lame;];time base=1/48000;frame rate=0/0;sample rate=48000;channels=2;];framerate:0/0;timebase:1/90000;direction:OUTBOUND;]

如何将其转换为 ffmpeg 命令?

对于这个 Xuggle 新手还有其他调试技巧吗?

【问题讨论】:

  • 在使用命令行 ffmpeg 玩了一下,似乎问题在于输入视频的音频速率与 flv 输出不兼容(例如,48000 Hz)。如果我对 ffmpeg 使用“-ar 44100”选项,则视频转换成功。现在将其转换为 Xuggle 代码...

标签: debugging ffmpeg lame xuggle


【解决方案1】:

问题解决了。这是由于 FLV 仅支持采样率为 44.1、22.05 和 11.025 kHz 的音频流。在监听 onAudioSamples() 的自定义 MediaTool 监听器中使用 Xuggle 的 IAudioResampler 类将音频重新采样到支持的速率。

【讨论】:

    【解决方案2】:

    我最近也遇到了同样的问题。花了几天时间直到我找到答案here

    【讨论】:

    • 如果您描述问题的解决方案而不是仅仅包含一个链接,您的回答会更有用。
    • @xlnc 我也试过这个,我试图转换为 3gp,所以在小细节上有一点不同,但它开始抛出一个空指针异常,我通过在onAddStream 方法。现在没有错误,但程序仍然很忙,并形成了一个 65 Kb 的文件,播放时表示该文件没有可播放的流。请你在这里以任何方式帮助我。
    • 你给的链接打不开。