我正在开发一个将Hadoop的MapReduce框架与Xuggle集成的程序.为此,我正在实现一个IURLProtocolHandlerFactory从内存Hadoop数据对象读取和写入的类.
您可以在此处查看相关代码:https: //gist.github.com/4191668
我的想法是 用UUID 注册类中的每个BytesWritable对象,IURLProtocolHandlerFactory这样当我稍后在打开文件时引用该名称时,它返回一个IURLProtocolHandler附加到该BytesWritable对象的实例,我可以从内存中读写内存.
问题是我得到这样的例外:
java.lang.RuntimeException: could not open: byteswritable:d68ce8fa-c56d-4ff5-bade-a4cfb3f666fe
at com.xuggle.mediatool.MediaReader.open(MediaReader.java:637)
Run Code Online (Sandbox Code Playgroud)
(另见发布的链接)
在调试时,我看到在工厂中正确找到了对象,而且甚至可以在协议处理程序中读取它们.如果我从输出文件中删除侦听器,则会发生同样的情况,因此问题已经出现在输入中.深入挖掘Xuggle的代码我到达JNI代码(试图打开文件),我不能比这更进一步.这显然会返回错误代码.
XugglerJNI.IContainer_open__SWIG_0
Run Code Online (Sandbox Code Playgroud)
我真的很感激一些暗示下一步该怎么做,我该如何继续调试.也许我的实现有一个缺陷,但我看不到它.
我试图用xuggle打开一个视频文件,如下所示:
if (container.open(in, null) < 0) {
throw new IllegalArgumentException("could not open file: ");
}
Run Code Online (Sandbox Code Playgroud)
当我使用mp4文件并且我传递给打开一个InputStream时,问题就出现了:
InputStream in = new FileInputStream(filename);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,IContainer.open仍然被阻止,并且不返回任何内容.
但是,如果我将文件名传递给open方法或者我使用flv格式,它可以正常工作.我必须使用带有mp4文件的InputStream.
有人可以帮我找到问题吗?
我们正在尝试从视频创建缩略图。我们尝试了两个第三方库。那些是
那些工作正常。但是我们正在尝试Java内置库。我们找到了一个Java库,那就是
javax.media。*
但是该库已贬值。我们无法使用它。
我们是否有针对此问题的Java内置库?
我正在编写 java 代码以接收 mp4 格式的视频文件,对其应用效果,然后将其保存到一个新文件中。代码应该将给定的视频拆分为其帧并将它们存储在一个数组中,以便每个帧都可以用于构建效果。这部分代码由xuggler处理,所以我很难确定哪里出了问题。
问题是,甚至在阅读视频的一张图片之前,错误就会被抛出,我不知道它指的是什么,广泛的谷歌搜索告诉我它与内存访问错误有关。
更奇怪的部分是它只发生在一些 mp4 文件上,即使它们都是 mp4 格式并且都应该以相同的方式运行。
我已经尝试了许多来自不同来源的不同 mp4 文件,其中一些有效,一些无效,似乎是随机的。我对应用效果最感兴趣的 mp4 是不起作用的 mp4 之一。
在下面的代码中,我在各个点使用打印语句进行了识别,导致错误的代码部分位于具有变量名称 media 的 IMediaListener 中的某处。侦听器本身由while(reader.readPacket()==null);ActionListener 内部的行调用,特别是在按“子”按钮触发的部分中。这是唯一被称为它的地方。
我应该注意,所有与 xuggler 相关的代码都不是我自己的,因为我在网上的代码演示中找到了它。我不会假装了解 xuggler 的工作原理。
import java.util.*;
import java.util.concurrent.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.filechooser.*;
import java.awt.image.*;
import com.xuggle.xuggler.*;
import com.xuggle.mediatool.*;
import com.xuggle.mediatool.event.*;
import java.awt.event.*;
public class mainClass {
static JFrame win=new JFrame();
static JPanel dis=new JPanel();
static JButton sub=new JButton("Submit"),b1=new JButton("Browse"),b2=new JButton("Browse");
static JTextField input=new JTextField(),output=new JTextField();
static String savePath="",sourcePath="";
static JLabel l1=new …Run Code Online (Sandbox Code Playgroud) 我最近开始使用Xuggle将各种格式的视频文件转换为相应的FLV(通过jwplayer在我们的网站上播放).我正在使用的代码非常简单; 基本上他们为基本视频转换教程展示了什么:
IMediaReader reader = ToolFactory.makeReader(file.getPath());
reader.addListener(ToolFactory.makeWriter(tempFileName, reader));
while (reader.readPacket() == null)
;
Run Code Online (Sandbox Code Playgroud)
这适用于我尝试过的约50%的视频.但是,我收到一些视频的以下错误(我遇到的所有.MP4s,以及一些.MOVs)
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
Run Code Online (Sandbox Code Playgroud)
我很难确定错误的根本原因是否与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;]
Run Code Online (Sandbox Code Playgroud)
我怎么把它翻译成ffmpeg命令?
这个Xuggle新手的任何其他调试技巧?
我正在尝试用Java中的Xuggler将aac/wav/wma音频文件转换为mp3.
不幸的是,我的质量大大降低.我的输入文件大小约为7MB,输出文件大小仅为1.5MB.
采样率设置为44100 Hz,是否还要设置其他参数?
谢谢您的回答.
if (args.length <= 1)
throw new IllegalArgumentException("must pass an input filename and output filename as argument");
IMediaWriter writer = ToolFactory.makeWriter(args[1]);
String filename = args[0];
// Create a Xuggler container object
IContainer container = IContainer.make();
// Open up the container
if (container.open(filename, IContainer.Type.READ, null) < 0)
throw new IllegalArgumentException("could not open file: " + filename);
// query how many streams the call to open found
int numStreams = container.getNumStreams();
// and iterate through the streams to …Run Code Online (Sandbox Code Playgroud) 我正在运行ffmpeg.exeJava代码来编码视频文件.当ffmpeg终止时(即视频文件被编码),我的程序将如何知道?
这是代码:
Runtime.getRuntime().exec("ffmpeg -ac 2 -i audio.wav -i video.flv -sameq out.flv");
Run Code Online (Sandbox Code Playgroud) 当我启动Java程序时,我收到此错误(使用带有Webcam的Xuggle-library):
问题签名:
问题事件名称:APPCRASH
应用程序名:java.exe的
应用程序版本:6.0.260.3
应用程序时间戳:4dc11607
故障模块名称:libxuggle轮渡-4.dll
故障模块版本:0.0.0.0
故障模块时间戳:4b9493c5
异常代码: 0000005
异常偏移:0000822a
OS版本:6.1.7601.2.1.0.256.48
区域设置ID:1031
其他信息1:0a9e
其他信息2:0a9e372d3b4ad19135b953a78882e789
附加信息3:0a9e
附加信息4:0a9e372d3b4ad19135b953a78882e789
我已经发现,c0000005是一种访问冲突.有没有办法解决这样的错误?或者我如何跟踪此错误(Stacktrace或其他东西,或者可能是某些工具)?Java是否为此类错误创建了日志文件.我在哪里可以找到它们?我的Java程序不会抛出任何异常.我刚刚得到这个appcrash和"Java结果:-xxxxxxx"(其中xxxxxx是一个大数字).
谢谢.