Introduction
Well in this article I’ll talk about how using ffmpeg with asp.net , for converting video , extracting preview image and ….
There are three way to using ffmpeg in your website:
Using sharpffmpeg ( http://sourceforge.net/projects/sharpffmpeg/ )
Using ffmpeg dll
Using ffmpeg execution
The last one is easiest one and in this article I’ll explain this way.
Why ffmpeg
First of all I dunno any other way for extracting a preview frame of 3gp files. ( but there are other ways for converting videos)
And Also ffmpeg support following formats :
FFmpeg supports the following file formats through the libavformat
library:
Supported File Format |
Encoding |
Decoding |
Comments |
MPEG audio |
X |
X |
MPEG-1 systems |
X |
X |
muxed audio and video |
MPEG-2 PS |
X |
X |
also known as VOB file |
MPEG-2 TS |
|
X |
also known as DVB Transport Stream |
ASF |
X |
X |
AVI |
X |
X |
WAV |
X |
X |
Macromedia Flash |
X |
X |
Only embedded audio is decoded. |
FLV |
X |
X |
Macromedia Flash video files |
Real Audio and Video |
X |
X |
Raw AC3 |
X |
X |
Raw MJPEG |
X |
X |
Raw MPEG video |
X |
X |
Raw PCM8/16 bits, mulaw/Alaw |
X |
X |
Raw CRI ADX audio |
X |
X |
Raw Shorten audio |
|
X |
SUN AU format |
X |
X |
NUT |
X |
X |
NUT Open Container Format |
QuickTime |
X |
X |
MPEG-4 |
X |
X |
MPEG-4 is a variant of QuickTime. |
Raw MPEG4 video |
X |
X |
DV |
X |
X |
4xm |
|
X |
4X Technologies format, used in some games. |
Playstation STR |
|
X |
Id RoQ |
X |
X |
Used in Quake III, Jedi Knight 2, other computer games. |
Interplay MVE |
|
X |
Format used in various Interplay computer games. |
WC3 Movie |
|
X |
Multimedia format used in Origin's Wing Commander III computer game. |
Sega FILM/CPK |
|
X |
Used in many Sega Saturn console games. |
Westwood Studios VQA/AUD |
|
X |
Multimedia formats used in Westwood Studios games. |
Id Cinematic (.cin) |
|
X |
Used in Quake II. |
FLIC format |
|
X |
.fli/.flc files |
Sierra VMD |
|
X |
Used in Sierra CD-ROM games. |
Sierra Online |
|
X |
.sol files used in Sierra Online games. |
Matroska |
X |
X |
Electronic Arts Multimedia |
|
X |
Used in various EA games; files have extensions like WVE and UV2. |
Nullsoft Video (NSV) format |
|
X |
ADTS AAC audio |
X |
X |
Creative VOC |
X |
X |
Created for the Sound Blaster Pro. |
American Laser Games MM |
|
X |
Multimedia format used in games like Mad Dog McCree |
AVS |
|
X |
Multimedia format used by the Creature Shock game. |
Smacker |
|
X |
Multimedia format used by many games. |
GXF |
X |
X |
General eXchange Format SMPTE 360M, used by Thomson Grass Valley playout servers. |
CIN |
|
X |
Multimedia format used by Delphine Software games. |
MXF |
|
X |
Material eXchange Format SMPTE 377M, used by D-Cinema, broadcast industry. |
SEQ |
|
X |
Tiertex .seq files used in the DOS CDROM version of the game Flashback. |
DXA |
|
X |
This format is used in non-Windows version of Feeble Files game and different game cutscenes repacked for use with ScummVM. |
THP |
|
X |
Used on the Nintendo GameCube. |
C93 |
|
X |
Used in the game Cyberia from Interplay. |
Bethsoft VID |
|
X |
Used in some games from Bethesda Softworks. |
CRYO APC |
|
X |
Audio format used in some games by CRYO Interactive Entertainment. |
X
means that encoding (resp. decoding) is supported.
FFmpeg can read and write images for each frame of a video sequence. The following image formats are supported:
Supported Image Format |
Encoding |
Decoding |
Comments |
PGM, PPM |
X |
X |
PAM |
X |
X |
PAM is a PNM extension with alpha support. |
PGMYUV |
X |
X |
PGM with U and V components in YUV 4:2:0 |
JPEG |
X |
X |
Progressive JPEG is not supported. |
.Y.U.V |
X |
X |
one raw file per component |
animated GIF |
X |
X |
Only uncompressed GIFs are generated. |
PNG |
X |
X |
2 bit and 4 bit/pixel not supported yet. |
Targa |
|
X |
Targa (.TGA) image format. |
TIFF |
X |
X |
YUV, JPEG and some extension is not supported yet. |
SGI |
X |
X |
SGI RGB image format |
PTX |
|
X |
V.Flash PTX format |
X
means that encoding (resp. decoding) is supported.
Supported Codec |
Encoding |
Decoding |
Comments |
MPEG-1 video |
X |
X |
MPEG-2 video |
X |
X |
MPEG-4 |
X |
X |
MSMPEG4 V1 |
X |
X |
MSMPEG4 V2 |
X |
X |
MSMPEG4 V3 |
X |
X |
WMV7 |
X |
X |
WMV8 |
X |
X |
not completely working |
WMV9 |
|
X |
not completely working |
VC1 |
|
X |
H.261 |
X |
X |
H.263(+) |
X |
X |
also known as RealVideo 1.0 |
H.264 |
|
X |
RealVideo 1.0 |
X |
X |
RealVideo 2.0 |
X |
X |
MJPEG |
X |
X |
lossless MJPEG |
X |
X |
JPEG-LS |
X |
X |
fourcc: MJLS, lossless and near-lossless is supported |
Apple MJPEG-B |
|
X |
Sunplus MJPEG |
|
X |
fourcc: SP5X |
DV |
X |
X |
HuffYUV |
X |
X |
FFmpeg Video 1 |
X |
X |
experimental lossless codec (fourcc: FFV1) |
FFmpeg Snow |
X |
X |
experimental wavelet codec (fourcc: SNOW) |
Asus v1 |
X |
X |
fourcc: ASV1 |
Asus v2 |
X |
X |
fourcc: ASV2 |
Creative YUV |
|
X |
fourcc: CYUV |
Sorenson Video 1 |
X |
X |
fourcc: SVQ1 |
Sorenson Video 3 |
|
X |
fourcc: SVQ3 |
On2 VP3 |
|
X |
still experimental |
On2 VP5 |
|
X |
fourcc: VP50 |
On2 VP6 |
|
X |
fourcc: VP60,VP61,VP62 |
Theora |
X |
X |
still experimental |
Intel Indeo 3 |
|
X |
FLV |
X |
X |
Sorenson H.263 used in Flash |
Flash Screen Video |
X |
X |
fourcc: FSV1 |
ATI VCR1 |
|
X |
fourcc: VCR1 |
ATI VCR2 |
|
X |
fourcc: VCR2 |
Cirrus Logic AccuPak |
|
X |
fourcc: CLJR |
4X Video |
|
X |
Used in certain computer games. |
Sony Playstation MDEC |
|
X |
Id RoQ |
X |
X |
Used in Quake III, Jedi Knight 2, other computer games. |
Xan/WC3 |
|
X |
Used in Wing Commander III .MVE files. |
Interplay Video |
|
X |
Used in Interplay .MVE files. |
Apple Animation |
X |
X |
fourcc: 'rle ' |
Apple Graphics |
|
X |
fourcc: 'smc ' |
Apple Video |
|
X |
fourcc: rpza |
Apple QuickDraw |
|
X |
fourcc: qdrw |
Cinepak |
|
X |
Microsoft RLE |
|
X |
Microsoft Video-1 |
|
X |
Westwood VQA |
|
X |
Id Cinematic Video |
|
X |
Used in Quake II. |
Planar RGB |
|
X |
fourcc: 8BPS |
FLIC video |
|
X |
Duck TrueMotion v1 |
|
X |
fourcc: DUCK |
Duck TrueMotion v2 |
|
X |
fourcc: TM20 |
VMD Video |
|
X |
Used in Sierra VMD files. |
MSZH |
|
X |
Part of LCL |
ZLIB |
X |
X |
Part of LCL, encoder experimental |
TechSmith Camtasia |
|
X |
fourcc: TSCC |
IBM Ultimotion |
|
X |
fourcc: ULTI |
Miro VideoXL |
|
X |
fourcc: VIXL |
QPEG |
|
X |
fourccs: QPEG, Q1.0, Q1.1 |
LOCO |
|
X |
|
Winnov WNV1 |
|
X |
|
Autodesk Animator Studio Codec |
|
X |
fourcc: AASC |
Fraps FPS1 |
|
X |
|
CamStudio |
|
X |
fourcc: CSCD |
American Laser Games Video |
|
X |
Used in games like Mad Dog McCree |
ZMBV |
X |
X |
Encoder works only on PAL8 |
AVS Video |
|
X |
Video encoding used by the Creature Shock game. |
Smacker Video |
|
X |
Video encoding used in Smacker. |
RTjpeg |
|
X |
Video encoding used in NuppelVideo files. |
KMVC |
|
X |
Codec used in Worms games. |
VMware Video |
|
X |
Codec used in videos captured by VMware. |
Cin Video |
|
X |
Codec used in Delphine Software games. |
Tiertex Seq Video |
|
X |
Codec used in DOS CDROM FlashBack game. |
DXA Video |
|
X |
Codec originally used in Feeble Files game. |
AVID DNxHD |
|
X |
aka SMPTE VC3 |
C93 Video |
|
X |
Codec used in Cyberia game. |
THP |
|
X |
Used on the Nintendo GameCube. |
Bethsoft VID |
|
X |
Used in some games from Bethesda Softworks. |
Renderware TXD |
|
X |
Texture dictionaries used by the Renderware Engine. |
X
means that encoding (resp. decoding) is supported.
Supported Codec |
Encoding |
Decoding |
Comments |
MPEG audio layer 2 |
IX |
IX |
MPEG audio layer 1/3 |
IX |
IX |
MP3 encoding is supported through the external library LAME. |
AC3 |
IX |
IX |
liba52 is used internally for decoding. |
Vorbis |
X |
X |
WMA V1/V2 |
X |
X |
AAC |
X |
X |
Supported through the external library libfaac/libfaad. |
Microsoft ADPCM |
X |
X |
MS IMA ADPCM |
X |
X |
QT IMA ADPCM |
|
X |
4X IMA ADPCM |
|
X |
G.726 ADPCM |
X |
X |
Duck DK3 IMA ADPCM |
|
X |
Used in some Sega Saturn console games. |
Duck DK4 IMA ADPCM |
|
X |
Used in some Sega Saturn console games. |
Westwood Studios IMA ADPCM |
|
X |
Used in Westwood Studios games like Command and Conquer. |
SMJPEG IMA ADPCM |
|
X |
Used in certain Loki game ports. |
CD-ROM XA ADPCM |
|
X |
CRI ADX ADPCM |
X |
X |
Used in Sega Dreamcast games. |
Electronic Arts ADPCM |
|
X |
Used in various EA titles. |
Creative ADPCM |
|
X |
16 -> 4, 8 -> 4, 8 -> 3, 8 -> 2 |
THP ADPCM |
|
X |
Used on the Nintendo GameCube. |
RA144 |
|
X |
Real 14400 bit/s codec |
RA288 |
|
X |
Real 28800 bit/s codec |
RADnet |
X |
IX |
Real low bitrate AC3 codec, liba52 is used for decoding. |
AMR-NB |
X |
X |
Supported through an external library. |
AMR-WB |
X |
X |
Supported through an external library. |
DV audio |
|
X |
Id RoQ DPCM |
X |
X |
Used in Quake III, Jedi Knight 2, other computer games. |
Interplay MVE DPCM |
|
X |
Used in various Interplay computer games. |
Xan DPCM |
|
X |
Used in Origin's Wing Commander IV AVI files. |
Sierra Online DPCM |
|
X |
Used in Sierra Online game audio files. |
Apple MACE 3 |
|
X |
Apple MACE 6 |
|
X |
FLAC lossless audio |
X |
X |
Shorten lossless audio |
|
X |
Apple lossless audio |
|
X |
QuickTime fourcc 'alac' |
FFmpeg Sonic |
X |
X |
experimental lossy/lossless codec |
Qdesign QDM2 |
|
X |
there are still some distortions |
Real COOK |
|
X |
All versions except 5.1 are supported |
DSP Group TrueSpeech |
|
X |
True Audio (TTA) |
|
X |
Smacker Audio |
|
X |
WavPack Audio |
|
X |
Cin Audio |
|
X |
Codec used in Delphine Software games. |
Intel Music Coder |
|
X |
Musepack |
|
X |
Only SV7 is supported |
DT$ Coherent Audio |
|
X |
ATRAC 3 |
|
X |
X
means that encoding (resp. decoding) is supported. I
means that an integer-only version is available, too (ensures high performance on systems without hardware floating point support).
Using the code
First of all go to this url ( http://arrozcru.no-ip.org/ffmpeg_builds/ ) and download latest ffmpeg builds.
For using sample of this article you’ll need to download ffmpeg from above link and put
“ffmpeg.exe” , “pthreadGC2.dll” , “SDL.dll” in sample project folder .
notice : you have to put a 3gp video and you must rename it to first.3gp in project folder or also you can change code for using other videos instead of first.3gp .
Code analyze
enclosed sample is straightforward and simple but we cover some part of it.
First of all you need to add System.Diagnostics name space to your project ( for accessing to process class )
Process ffmpeg;
string video;
string thumb;
video = Page.MapPath("first.3gp");
thumb = Page.MapPath("") +"\\frame.jpg";
ffmpeg = new Process();
ffmpeg.StartInfo.Arguments = " -i \""+video+"\" -s 108*80 -vframes 1 -f image2 -vcodec mjpeg \""+thumb+"\"";
ffmpeg.StartInfo.FileName = Page.MapPath("ffmpeg.exe");
ffmpeg.Start();
The code above is used to extracting a preview image from 3gp video.
You see that we have 2 variables , video and thumb that name of both is clear
Video variable hold video which we want to extracting preview thumbnail or image from ( usually the video which user uploaded )
And thumb hold the name that we want to call the output file.
We combine them and send them as arguments to ffmpeg. these special arguments tell ffmpeg create image with 180*80 resolution , you can change each part of it .
Now let’s look at the code behind convert button in our project :
Process ffmpeg;
string video;
string mpg;
video = Page.MapPath("first.3gp");
mpg = Page.MapPath("") + "\\video.mpg";
ffmpeg = new Process();
ffmpeg.StartInfo.Arguments = " -i \"" + video + "\" -target vcd \"" + mpg + "\"";
ffmpeg.StartInfo.FileName = Page.MapPath("ffmpeg.exe");
ffmpeg.Start();
You see that all thing are the same just the name of variable of output file changed and now we call it mpg and the arguments of ffmpeg also changed.
You see it’s really easy. But please consider that converting videos is so heavy process, you must have good reason to letting user to converting video on your web site.
Conclusion
Thats all, I hope you enjoyed of reading this article and find it useful and please consider that it was my first article.
If you have your own server you don’t have problem and surely you have permission for executing file
But if you use shared web server ( like me ! ) coz ffmpeg is well know open source project you can talk to your host manager and giving information about ffmpeg and its usage or giving its url
Maybe in future I write about other way.