guys,
~
I just wanted to let you know that I haven't forgotten working on
tika's media branch. The thing is that ffmpeg developers (specially
Stefano Sabatini) have been nicely receptive and helpful:
~
http://ffmpeg-users.933282.n4.nabble.com/
~
: getting some xml-ish dump while ffprobing a media file's metadata?
~
: standard err or out?
~
and also, well, you know, we are all busy doing other things ;-), so.
I have had to change my starting code a few times. I just went monkey
and did things the way I thought (without reading your code base),
because I wanted to thoroughly test ffmpeg output first (to the extent
that java would let you). Basically I used some thread-base code to
get the standard output and error stream
~
// __
class StreamGrabber02 extends Thread{
InputStream IS;
private String aStringedStream;
private final int iSz = 8192;
// __
StreamGrabber02(InputStream IS, String aThrdNm){
this.IS = IS;
setName(aThrdNm + "_" + this);
}
// __
public void run(){
int iL = 0;
ByteArrayOutputStream BAOS = null;
byte[] bAr = new byte[iSz];
try{
BAOS = new ByteArrayOutputStream();
while ((iL = IS.read(bAr, 0, iSz)) != -1){ BAOS.write(bAr, 0, iL);
} BAOS.flush();
this.aStringedStream = new String(BAOS.toByteArray());
}catch(IOException IOX){
System.err.println("// __ thread name: |" + getName() + "|");
IOX.printStackTrace(System.err);
}
}
// __
public String getStringedStream(){ return(this.aStringedStream); }
}
~
and running ffprobe like this
~
Process Prx = RTm.exec((new String[]{”ffprobe”, "-unit",
"-show_streams", "-show_format", "-loglevel", "-loglevel", <media
input file>}));
~
InputStream ISErr = Prx.getErrorStream();
~
StreamGrabber02 SGrbErr = new StreamGrabber02(ISErr, aThrdNm +
".err"); SGrbErr.start();
~
InputStream ISIn= Prx.getInputStream();
StreamGrabber02 SGrbIn = new StreamGrabber02(ISIn, aThrdNm + ".in");
SGrbIn.start();
// __
iExitVal = Prx.waitFor();
SGrbErr.join(); SGrbIn.join();
ISIn.close(); ISErr.close();
Prx.destroy();
~
then, depending on there being errors or not, the exit code of the
errors and the extension of the file, I logged the stream outputs to
different folders/files
~
// __
if(iExitVal != 0){
ODir = new File(ODirErrs, (new Integer(iExitVal)).toString());
if(!ODir.exists()){ ODir.mkdirs(); }
OFl = new File(ODir, "_" + aX + ".log.txt");
OSWrtr = new OutputStreamWriter(new FileOutputStream(OFl, true), "UTF-8");
OSWrtr.write(aB.toString());
OSWrtr.close();
}
else{
ODir = new File(ODirOK, (new Integer(iExitVal)).toString());
if(!ODir.exists()){ ODir.mkdirs(); }
OFl = new File(ODir, "_" + aX + ".log.txt");
OSWrtr = new OutputStreamWriter(new FileOutputStream(OFl, true), "UTF-8");
OSWrtr.write(aB.toString());
OSWrtr.close();
// __
++lFlsOK;
}
~
In order to do functional and stress testing, I had no option but
abusing http://samples.mplayerhq.hu/00-README. I wouldn't provide you
with stress test results right now, because ffmpeg developers have
including a flag to ffprobe's output as schema-based xml and I am
again/still streamlining things
~
I think I should work next on making this starting code more kosher
and align it with tika's base. I notice there is going to be
"cultural" issues (other than offering/maintaining the code) if the
decision is made to go ahead and use ffmpeg as our underlying library
for users of the supported operating systems (how to install it and
such things)
~
Can you just tell me which class/documentation based on a similar
library should I use as example?
~
Is it OK for me to just post the whole code listing here or some
public site before you decide (or not) to make me one of that code
base committers?
~
Any other advice about how to proceed next?
~
lbrtchx