使用 ffmpeg 在 asp.net 中转换和提取预览图像






2.47/5 (21投票s)
如何使用 ffmpeg
引言
在这篇文章中,我将讨论如何在 asp.net 中使用 ffmpeg 进行视频转换、提取预览图像等。
在你的网站中有三种使用 ffmpeg 的方法
使用 sharpffmpeg ( http://sourceforge.net/projects/sharpffmpeg/ )
使用 ffmpeg dll
使用 ffmpeg 执行
最后一种是最简单的一种,在这篇文章中我将解释这种方法。
为什么选择 ffmpeg
首先,我不知道除了这个方法还有其他方法可以从 3gp 文件中提取预览帧。(但是对于视频转换,还有其他方法)
而且 ffmpeg 支持以下格式
2.1 文件格式
FFmpeg 通过 libavformat
库支持以下文件格式
支持的文件格式 | 编码 | 解码 | 注释 |
MPEG 音频 | X | X | |
MPEG-1 系统 | X | X | 混合音频和视频 |
MPEG-2 PS | X | X | 也称为 VOB 文件 |
MPEG-2 TS | X | 也称为 DVB Transport Stream | |
ASF | X | X | |
AVI | X | X | |
WAV | X | X | |
Macromedia Flash | X | X | 仅解码嵌入式音频。 |
FLV | X | X | Macromedia Flash 视频文件 |
Real 音频和视频 | X | X | |
原始 AC3 | X | X | |
原始 MJPEG | X | X | |
原始 MPEG 视频 | X | X | |
原始 PCM8/16 位,mulaw/Alaw | X | X | |
原始 CRI ADX 音频 | X | X | |
原始 Shorten 音频 | X | ||
SUN AU 格式 | X | X | |
NUT | X | X | NUT Open Container Format |
QuickTime | X | X | |
MPEG-4 | X | X | MPEG-4 是 QuickTime 的一个变体。 |
原始 MPEG4 视频 | X | X | |
DV | X | X | |
4xm | X | 4X Technologies 格式,用于某些游戏。 | |
Playstation STR | X | ||
Id RoQ | X | X | 用于 Quake III、Jedi Knight 2 等电脑游戏。 |
Interplay MVE | X | 格式,用于各种 Interplay 电脑游戏。 | |
WC3 Movie | X | 多媒体格式,用于 Origin 的 Wing Commander III 电脑游戏。 | |
Sega FILM/CPK | X | 用于许多 Sega Saturn 主机游戏。 | |
Westwood Studios VQA/AUD | X | 多媒体格式,用于 Westwood Studios 游戏。 | |
Id Cinematic (.cin) | X | 用于 Quake II。 | |
FLIC 格式 | X | .fli/.flc 文件 | |
Sierra VMD | X | 用于 Sierra CD-ROM 游戏。 | |
Sierra Online | X | .sol 文件,用于 Sierra Online 游戏。 | |
Matroska | X | X | |
Electronic Arts Multimedia | X | 用于各种 EA 游戏;文件扩展名如 WVE 和 UV2。 | |
Nullsoft Video (NSV) 格式 | X | ||
ADTS AAC 音频 | X | X | |
Creative VOC | X | X | 为 Sound Blaster Pro 创建。 |
American Laser Games MM | X | 多媒体格式,用于 Mad Dog McCree 等游戏 | |
AVS | X | 多媒体格式,用于 Creature Shock 游戏。 | |
Smacker | X | 多媒体格式,用于许多游戏。 | |
GXF | X | X | General eXchange Format SMPTE 360M,用于 Thomson Grass Valley 播出服务器。 |
CIN | X | 多媒体格式,用于 Delphine Software 游戏。 | |
MXF | X | Material eXchange Format SMPTE 377M,用于 D-Cinema、广播行业。 | |
SEQ | X | Tiertex .seq 文件,用于 Flashback 游戏 DOS CDROM 版本。 | |
DXA | X | 此格式用于 Feeble Files 游戏的非 Windows 版本,以及为 ScummVM 重新打包的各种游戏过场动画。 | |
THP | X | 用于 Nintendo GameCube。 | |
C93 | X | 用于 Interplay 的游戏 Cyberia。 | |
Bethsoft VID | X | 用于 Bethesda Softworks 的一些游戏。 | |
CRYO APC | X | 音频格式,用于 CRYO Interactive Entertainment 的一些游戏。 |
X
表示支持编码(或解码)。
2.2 图像格式
FFmpeg 可以为视频序列的每一帧读取和写入图像。支持以下图像格式
支持的图像格式 | 编码 | 解码 | 注释 |
PGM, PPM | X | X | |
PAM | X | X | PAM 是 PNM 的扩展,支持 alpha 通道。 |
PGMYUV | X | X | PGM 带有 YUV 4:2:0 的 U 和 V 分量 |
JPEG | X | X | 不支持渐进式 JPEG。 |
.Y.U.V | X | X | 每个分量一个原始文件 |
动画 GIF | X | X | 仅生成未压缩的 GIF。 |
PNG | X | X | 暂不支持 2 位和 4 位/像素。 |
Targa | X | Targa (.TGA) 图像格式。 | |
TIFF | X | X | 暂不支持 YUV、JPEG 和一些扩展。 |
SGI | X | X | SGI RGB 图像格式 |
PTX | X | V.Flash PTX 格式 |
X
表示支持编码(或解码)。
2.3 视频编解码器
支持的编解码器 | 编码 | 解码 | 注释 |
MPEG-1 视频 | X | X | |
MPEG-2 视频 | X | X | |
MPEG-4 | X | X | |
MSMPEG4 V1 | X | X | |
MSMPEG4 V2 | X | X | |
MSMPEG4 V3 | X | X | |
WMV7 | X | X | |
WMV8 | X | X | 不完全可用 |
WMV9 | X | 不完全可用 | |
VC1 | X | ||
H.261 | X | X | |
H.263(+) | X | X | 也称为 RealVideo 1.0 |
H.264 | X | ||
RealVideo 1.0 | X | X | |
RealVideo 2.0 | X | X | |
MJPEG | X | X | |
无损 MJPEG | X | X | |
JPEG-LS | X | X | fourcc: MJLS,支持无损和近乎无损 |
Apple MJPEG-B | X | ||
Sunplus MJPEG | X | fourcc: SP5X | |
DV | X | X | |
HuffYUV | X | X | |
FFmpeg Video 1 | X | X | 实验性无损编解码器 (fourcc: FFV1) |
FFmpeg Snow | X | X | 实验性小波编解码器 (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 | 仍处于实验阶段 | |
On2 VP5 | X | fourcc: VP50 | |
On2 VP6 | X | fourcc: VP60,VP61,VP62 | |
Theora | X | X | 仍处于实验阶段 |
Intel Indeo 3 | X | ||
FLV | X | X | Flash 中使用的 Sorenson H.263 |
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 | 用于某些电脑游戏。 | |
Sony Playstation MDEC | X | ||
Id RoQ | X | X | 用于 Quake III、Jedi Knight 2 等电脑游戏。 |
Xan/WC3 | X | 用于 Wing Commander III .MVE 文件。 | |
Interplay Video | X | 用于 Interplay .MVE 文件。 | |
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 | 用于 Quake II。 | |
Planar RGB | X | fourcc: 8BPS | |
FLIC 视频 | X | ||
Duck TrueMotion v1 | X | fourcc: DUCK | |
Duck TrueMotion v2 | X | fourcc: TM20 | |
VMD Video | X | 用于 Sierra VMD 文件。 | |
MSZH | X | LCL 的一部分 | |
ZLIB | X | X | LCL 的一部分,编码器实验性 |
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 | 用于 Mad Dog McCree 等游戏 | |
ZMBV | X | X | 编码器仅在 PAL8 上工作 |
AVS Video | X | Creature Shock 游戏使用的视频编码。 | |
Smacker Video | X | Smacker 中使用的视频编码。 | |
RTjpeg | X | NuppelVideo 文件中使用的视频编码。 | |
KMVC | X | Worms 游戏使用的编解码器。 | |
VMware Video | X | VMware 捕获的视频中使用的编解码器。 | |
Cin Video | X | Delphine Software 游戏中使用的编解码器。 | |
Tiertex Seq Video | X | DOS CDROM FlashBack 游戏使用的编解码器。 | |
DXA Video | X | Feeble Files 游戏最初使用的编解码器。 | |
AVID DNxHD | X | 又名 SMPTE VC3 | |
C93 Video | X | Cyberia 游戏使用的编解码器。 | |
THP | X | 用于 Nintendo GameCube。 | |
Bethsoft VID | X | 用于 Bethesda Softworks 的一些游戏。 | |
Renderware TXD | X | Renderware Engine 使用的纹理字典。 |
X
表示支持编码(或解码)。
2.4 音频编解码器
支持的编解码器 | 编码 | 解码 | 注释 |
MPEG 音频层 2 | IX | IX | |
MPEG 音频层 1/3 | IX | IX | MP3 编码通过外部库 LAME 支持。 |
AC3 | IX | IX | liba52 在内部用于解码。 |
Vorbis | X | X | |
WMA V1/V2 | X | X | |
AAC | X | X | 通过外部库 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 | 用于某些 Sega Saturn 主机游戏。 | |
Duck DK4 IMA ADPCM | X | 用于某些 Sega Saturn 主机游戏。 | |
Westwood Studios IMA ADPCM | X | 用于 Westwood Studios 游戏,如 Command and Conquer。 | |
SMJPEG IMA ADPCM | X | 用于某些 Loki 游戏端口。 | |
CD-ROM XA ADPCM | X | ||
CRI ADX ADPCM | X | X | 用于 Sega Dreamcast 游戏。 |
Electronic Arts ADPCM | X | 用于各种 EA 游戏。 | |
Creative ADPCM | X | 16 -> 4, 8 -> 4, 8 -> 3, 8 -> 2 | |
THP ADPCM | X | 用于 Nintendo GameCube。 | |
RA144 | X | Real 14400 位/秒编解码器 | |
RA288 | X | Real 28800 位/秒编解码器 | |
RADnet | X | IX | Real 低比特率 AC3 编解码器,liba52 用于解码。 |
AMR-NB | X | X | 通过外部库支持。 |
AMR-WB | X | X | 通过外部库支持。 |
DV 音频 | X | ||
Id RoQ DPCM | X | X | 用于 Quake III、Jedi Knight 2 等电脑游戏。 |
Interplay MVE DPCM | X | 用于各种 Interplay 电脑游戏。 | |
Xan DPCM | X | 用于 Origin 的 Wing Commander IV AVI 文件。 | |
Sierra Online DPCM | X | 用于 Sierra Online 游戏音频文件。 | |
Apple MACE 3 | X | ||
Apple MACE 6 | X | ||
FLAC 无损音频 | X | X | |
Shorten 无损音频 | X | ||
Apple 无损音频 | X | QuickTime fourcc 'alac' | |
FFmpeg Sonic | X | X | 实验性有损/无损编解码器 |
Qdesign QDM2 | X | 仍然存在一些失真 | |
Real COOK | X | 支持所有版本,除了 5.1 | |
DSP Group TrueSpeech | X | ||
True Audio (TTA) | X | ||
Smacker Audio | X | ||
WavPack Audio | X | ||
Cin Audio | X | Delphine Software 游戏中使用的编解码器。 | |
Intel Music Coder | X | ||
Musepack | X | 仅支持 SV7 | |
DT$ Coherent Audio | X | ||
ATRAC 3 | X |
X
表示支持编码(或解码)。I
表示也提供了纯整数版本(确保在没有硬件浮点支持的系统上性能高)。
使用代码
首先,请访问此网址( http://arrozcru.no-ip.org/ffmpeg_builds/ ),下载最新的 ffmpeg 构建版本。
要使用本文的示例,您需要从上述链接下载 ffmpeg 并将
“ffmpeg.exe” 、“pthreadGC2.dll” 、“SDL.dll” 放在示例项目文件夹中。
注意:您需要放置一个 3gp 视频,并且必须将其重命名为 first.3gp 在项目文件夹中,或者您也可以修改代码以使用 first.3gp 以外的其他视频。
代码分析
附带的示例非常直接简单,但我们会涵盖其中的一部分。
首先,您需要将 System.Diagnostics 命名空间添加到您的项目中(用于访问 Process 类)
// preview frame
Process ffmpeg; // creating process
string video;
string thumb;
video = Page.MapPath("first.3gp"); // setting video input name with path
thumb = Page.MapPath("") +"\\frame.jpg"; // thumb name with path !
ffmpeg = new Process();
ffmpeg.StartInfo.Arguments = " -i \""+video+"\" -s 108*80 -vframes 1 -f image2 -vcodec mjpeg \""+thumb+"\""; // arguments !
ffmpeg.StartInfo.FileName = Page.MapPath("ffmpeg.exe");
ffmpeg.Start(); // start !
上面的代码用于从 3gp 视频提取预览图像。
您可以看到我们有两个变量,video 和 thumb,它们的名字都很清楚
Video 变量保存我们要从中提取预览缩略图或图像的视频(通常是用户上传的视频)
而 thumb 保存我们想要输出文件调用的名称。
我们将它们组合起来,并将它们作为参数传递给 ffmpeg。这些特殊参数告诉 ffmpeg 创建一个 180*80 分辨率的图像,您可以更改其中的任何部分。
现在,让我们看看我们项目中转换按钮后面的代码
//converting video
Process ffmpeg; // creating process
string video;
string mpg;
video = Page.MapPath("first.3gp"); // setting video input name with path
mpg = Page.MapPath("") + "\\video.mpg"; // thumb name with path !
ffmpeg = new Process();
ffmpeg.StartInfo.Arguments = " -i \"" + video + "\" -target vcd \"" + mpg + "\""; // arguments !
ffmpeg.StartInfo.FileName = Page.MapPath("ffmpeg.exe");
ffmpeg.Start(); // start !
您可以看到一切都相同,只是输出文件的变量名称发生了变化,现在我们称之为 mpg,ffmpeg 的参数也发生了变化。
您看到它确实很简单。但请注意,转换视频是一个非常繁重的过程,您必须有充分的理由允许用户在您的网站上进行视频转换。
结论
就这样,希望您喜欢阅读本文并觉得它有用,并且请注意这是我的第一篇文章。
如果您有自己的服务器,您不会遇到问题,并且肯定有执行文件的权限
但如果您使用共享 Web 服务器(和我一样!),因为 ffmpeg 是一个知名的开源项目,您可以与您的主机管理员交谈,并提供关于 ffmpeg 及其用法的信息或提供其 URL
也许将来我会写到其他方法。