Skip to content

jitsi/fmj

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

README for FMJ

FMJ supports movie and audio file playback, as well as viewing of
video from a capture device, on Windows, Mac OS X, and
Linux.  

--------------------------------------------------------------------
Requirements: Java 5

--------------------------------------------------------------------
Applications

Run the .sh/.bat for your platform.  There are several apps included: 
fmjstudio,
fmjplay, 
fmjtranscode, and
fmjregistry.

fmjstudio lets you play media, and has dropdowns already
for the sample media included with FMJ.  If you have a video camera
installed on your system, you should be able to view it using the
appropriate tool button.

fmjplay is a no-frills player.  Requires the media parameter as a 
URL as a command-line argument.  Files must begin with file:https://

fmjtranscode is a command-line transcoding application.  Run it with no 
arguments to get example usage.  

fmjregistry is similar to the JMF JMFRegistry app.  It is NOT 
necessary to run this app to view the samples.  It is useful if
you are using external codecs, etc., which need to be registered
(example, JFFMPEG). In particular, FMJStudio can do dynamic capture
device detection, so there is no need to do this in the registry.

There is an example of how to use FMJ in an applet in applet.example. 
Please read the comments in the HTML files.

--------------------------------------------------------------------
External, Native Libraries

FMJ can take advantage of a number of native, dynamic libraries, if they 
are present, and in your library path.  

1. ffmpeg
2. ogg/vorbis/theora
3. gstreamer

In general, you may sometimes have
to set your library path explicitly, for example on *nix systems, something 
like:
export LD_LIBRARY_PATH=/usr/local/lib

Here are instructions on how to get and build these libraries, if you do 
not have them.  The instructions are for *nix systems, it is certainly possible
to build them on Windows systems, but you'll have to look online for how to do 
that.

-------------------------------------
ffmpeg:

Note: mmx is disabled in this example, as it has caused problems in the past.

Step 1:
Get ffmpeg sources from https://ffmpeg.mplayerhq.hu/

Step 2: build/install ffmpeg

./configure --disable-mmx --enable-shared
make
sudo make install

-------------------------------------
theora:

Step 1:
Get ogg, vorbis, theora sources from https://www.theora.org/

This library was built/tested with:
    * libtheora-1.0alpha7
    * libogg-1.1.3
    * libvorbis-1.1.2


Step 2: build/install ogg, vorbis, theora, by running the standard build 
procedure in each of the 3 directories:

./configure
make
sudo make install

-------------------------------------
gstreamer:

Available from https://gstreamer.freedesktop.org/


--------------------------------------------------------------------
Troubleshooting:

---
Cannot find a DataSource for: civil...

WARNING: net.sf.fmj not found in PackageManager.getContentPrefixList() and PackageManager.getProtocolPrefixList(); is JMF ahead of FMJ in the classpath?

WARNING: javax.media.Manager is JMF's implementation, not FMJ's; is JMF ahead of FMJ in the classpath?

One very common problem is to have JMF ahead of FMJ in the classpath.  If this is the case, then 
you will be using the JMF registry, in which case nothing from FMJ will be registered.  The
FMJ apps will generally work (that is, you'll be able to open and play media, etc.), but anything
that requires FMJ will not work.  The FMJ apps will output a warning to the logger (which generally
goes to the console) if this is the case.

To aid with troubleshooting, it is recommended that you change your logging.properties (in the current
dir of FMJ) to use debug-level logging.  To do so, change
fmj.level=INFO

to
fmj.level=FINE

---
WARNING: java.lang.UnsatisfiedLinkError: [...]\jdshow.dll: Can't find dependent libraries
java.lang.UnsatisfiedLinkError: [...]\jdshow.dll: Can't find dependent libraries

jawt.dll probably is not in your PATH.  See Platform-specific notes for Windows:

---
On Windows, when trying to play media: net.sf.jdshow.ComException: hr=-2146697203 

This is a Windows error pertaining to the URL or path specified.  See https://support.microsoft.com/kb/234292

In particular, Windows is pickier than FMJ about slashes in the URL.

For example, the following URL does not work with Windows (when DirectShow is being used for the playback):
file:https:///F:\safexmas.mov

But, remove one forward slash from the URL, like this:
file:https://F:\safexmas.mov

And it will work, assuming everything else is correct.

---

 java.lang.UnsatisfiedLinkError: /tmp/jna44845.so: /lib64/tls/libc.so.6: version `GLIBC_2.4' not found (required by /tmp/jna44845.so)
 
 (NOTE: you will only get this error for the first JNA-based plugin that is loaded, the other ones will fail with a different exception, which by default does not get logged)
 
 This is because JNA was built on a newer system than yours.  You'll have to build JNA from scratch.  We are currently using the jnalib-v3 branch of JNA.
 
 svn checkout https://jna.dev.java.net/svn/jna/branches/jnalib-v3 jna --username yourjavanetusername
 
 -- problems with jdshow on windows
 
 If you wish to eliminate the usage of jdshow for windows playback, in case it is causing problems for you:
 
To disable jdshow, you can either remove jdshow.dll from your library path, or you can remove this code from RegistryDefaults.java:
contentPrefixList.add("net.sf.fmj.ds");
Or you can run the registry tool, remove net.sf.fmj.ds from the content prefix list, and then run FMJ studio.  
This stores your registry settings in a file .fmj.registry.xml.  
The danger of doing this is that this will now override any future changes to RegistryDefaults, 
so you might want to delete that file if RegistryDefaults is changed in CVS.
 
 

--------------------------------------------------------------------
Platform-specific notes:

Windows: 

For movie playback (as well as capture), requires DirectShow to be installed.  
If you get an error that jawt.dll cannot be found, find it in your JRE 
directory and copy it to somewhere in your PATH (perhaps the current
directory).

---
From whome:
I edited fmjstudio.bat file and put JRE/bin folder to path variable. Doing so I did not have to copy jawt.dll file to the app folder.

[ fmjstudio.bat ]
rem jawt.dll must be found from path
set path=%path%;C:\Program Files\Java\jre1.5.0_07\bin

java -classpath fmj.jar...[etc]
---

Linux:

Movie playback is not yet implemented.  Movie playback will work 
for some movies (including the sample(s)) if JMF is added to 
the classpath.  It is sufficient to add jmf.jar (cross-platform)
version to the classpath.

Native playback is planned for Linux but development has not yet started.

--------------------------------------------------------------------
Using FMJ with JMF.

There are many cases where the plug-ins and other functionality of FMJ/JMF can be used with the other. 
This can be useful to work around bugs and missing functionality in either.

There are 2 ways to do this:
1. Using FMJ alongside JMF (JMF is ahead in the classpath - fmj-nojmf.jar is intended for this)
2. Using JMF alongside FMJ (FMJ is ahead in the classpath - JMF cannot be installed).


One example is using lti-civil capture devices with JMF.

lti-civil does not contain any JMF-related code.  So to use lti-civil with JMF you need at least part of FMJ (the civil DataSource and any classes it requires).  The easiest way to do this is to put JMF ahead of FMJ in the classpath (which is generally true anyway if JMF is actually installed), and then add "net.sf.fmj" to your protocol prefix list in the JMF registry.  You can also add this at runtime by doing something like:

		final Vector v = PackageManager.getProtocolPrefixList();
		
			if (!v.contains("net.sf.fmj"))
				v.add("net.sf.fmj");
		

		PackageManager.setProtocolPrefixList(v);

This will allow you to create a player/processor using "civil:/0" as the URL.

--------------------------------------------------------------------
Directories.
Not all directories are in the release, some are only in CVS.

Directory                 Description
src                       Main source folder for FMJ
src.capture               JavaSound and LTI-CIVIL capture DataSources
src.ejmf                  Source borrowed and adapted from the EJMF book (with permission)
src.sip-communicator      Source borrowed from the SIP-Communicator project (speex and ilbc RTP codecs)    
src.examples.rtp
src.ffmpeg-java           Demux that uses the ffmpeg-java subproject
src.theora-java           Demuxes that use the theora-java subproject
src.rtp                   RTP manager implementation
src.stubs                 Stubbed implementations of sun/ibm internal JMF classes that can be useful to get JMF-dependent projects to compile
src.ds                    DirectShow Player
src.utils                 LTI utils classes
src.examples.ejmf         Examples from the EJMF book
src.examples.jmf          Examples from the JMF website
src.examples.jmf.guide    Examples from the JMF guide
src.experimental          Experimental FMJ source.  Not used yet.
src.qt                    Quicktime (QTJ) Player
src.qtfile                MOV file atom parsing (from Chris Adamson).  Not used.
src.sunibm.replace        Replacements for sun/ibm internal JMF classes that are implemented by extending the FMJ equivalents.  
                          Not generally needed unless you want to play classpath tricks.  Needed to compile/run unit tests.
src.sunibm.base           Implementations of internal sun/ibm base classes that are often used (unfortunately) by many JMF-based 
                          projects.
src.test                  Unit tests
src.apps                  Assorted applications, including
                          - FmjMediaServer: fi.iki.elonen.nanohttpd.NanoHTTPD, and media server which can be used to stream media, transcoded media, and live captured media.
                          - FmjPlay: a simple barebones media player (much simpler than FMJStudio)
                          - FmjTranscode: a transcoder application
                          - FmjApplet: a media applet
src.fmjstudio             FmjStudio and FmjRegistry applications
src.t4l                   Source from com.t4l, contributed by Jeremy Wood

applet.example            example of how to use FMJ in an applet
build                     build output directory
lib                       jars that FMJ uses or depends on
nativelib                 native libraries (JNI) that FMJ uses
nbproject                 NetBeans project.  Note that you have to replace build.xml with build.netbeans.xml to use NetBeans
samplemedia               Sample media files
sh                        shell/.bat files to launch FMJ studio and the registry editor.
website                   old website
website2                  old website
website3                  website
webstart.example          Example of launching FMJ studio with Java webstart (not working yet).

--------------------------------------------------------------------
Joining the development team

- Download the FMJ release, play around with FMJStudio
- Get a sourceforge user account.
- Get the FMJ source code from CVS.
- Subscribe to the fmj-devel mailing list
- Review some of the documents and links on the FMJ website, particularly those pertaining to roadmap and status.
- Do you have a particular project that you would like to get working with FMJ, or particular goals to achieve?  
  This is a good place to start.  See if it works with FMJ (without JMF), and perhaps report your findings to 
  the fmj-devel mailing list, and the team will likely have ideas on where to start.
- Do you have any particular area of interest or expertise?  This is also very relevant, as there are many 
  different tasks to be done, all the way from native library wrapping, porting codecs from C, to GUI work, 
  testing, optimization and improvement across the board.  For example, are you interested in playback, transcoding, streaming,
  applets, RTP, live audio and video capture?  Do you have experience with image rendering, javasound, general Java 
  architecture and design, media formats, ffmpeg, directshow, quicktime, gstreamer, theora, native coding, JNI, JNA,
  etc, etc, etc... Please don't be intimidated by the long list of complicated technologies that FMJ integrates with,
  nobody on the team is an expert in all of these.  There is an optimal niche for everyone, regardless of 
  breadth and depth of experience.  And even without any particular multimedia experience, there are interesting tasks to be done.
  
  
--------------------------------------------------------------------
Contributors

Note: not everyone who has contributed is included here.  If you 
have contributed and have been overlooked here, don't take it 
personally, just let the team know and you'll be added.

Thanks also to others for submitting patches, bug reports, and
feedback.

Thanks also to other open-source projects, books, and examples from 
which source has been borrowed/adapted, like SIP-Communicator,
EJMF, and others.

Name:     Ken Larson (kenlars99)
Role:     Developer
Areas:    Project leader
Location: USA and Germany

Name:     Warren Bloomer (stormboy)
Role:     Developer
Areas:    FMJStudio, FMJRegistry, audio/video renderers.
Location: Australia
    
Name:     Andrew Rowley (zzalsar4)
Role:     Developer
Areas:    RTP 
Location: England

Name:     Christian Vincenot (sgt_sagara)
Role:     Developer
Areas:    RTP 
Location: France

Name:     Andrey Kuprianov (andreyvk)
Role:     Web designer and administrator
Location: Russia and Thailand

Name:     Stephan Goetter (turms)
Role:     Developer
Areas:    ffmpeg-java
Location: Germany

Name:     Jeremy Wood
Role:     Developer
Areas:    JPEG encoding/decoding, buffer/image conversion, optimization

Name:     Damian Minkov
Role:     Developer (SIP-Communicator)
Areas:    SIP-Communicator RTP Codecs



--------------------------------------------------------------------
Supported Formats

Native wrapper playback:

Wrapper for          OS             Formats
DirectShow           Windows        Pretty much anything!
Quicktime for Java   Mac OS X       Pretty much anything!
GStreamer            Any            Pretty much anything!

Native wrapper processing an playback:
Wrapper for          OS             Formats
ffmpeg               Any            Pretty much anything!


Pure Java processing and playback:
Container                  Decode, Encode
 Format
 
RTP
 JPEG/RTP                  D,E
 ULAW/RTP                  D,E
 ALAW/RTP                  D,E
 SPEEX/RTP                 D,E
 ILBC/RTP                  D,E
WAV
 LINEAR (PCM)              D,E
AU
 LINEAR (PCM)              D,E
 ULAW                      D,?
AIFF
 LINEAR (PCM)              D,E
 
multpart/x-mixed-replace
 JPEG                      D,E
 GIF                       D,E (encoding only with Java 6+)
 PNG                       D,E
 
ogg
 VORBIS                    D
 THEORA                    D
 
mp3
 mp3                       D
 

Assorted pure Java codecs:
Audio resampling
Video scaling

Capture:
Type     Technology                     OS
Audio    JavaSound                      All
Video    LTI-CIVIL,DirectShow           Windows
         LTI-CIVIL,V4L2                 Linux
         LTI-CIVIL,Quicktime for Java   Mac OS X



Note: FMJ and JMF can use each others' plugins, assuming the classpath and
registry is set appropriately.

For JMF supported formats, see:
https://java.sun.com/products/java-media/jmf/2.1.1/formats.html