利用 FFmpeg 将 MP4 转成 FLV

最近做一个小项目,要在线播放录制的 MP4 视频,想开源的 flash player 或 html 5 可以播放。可,虽然 MP4 是 H.264 编码,但就是播放不了。可能是封装方式(PS 方式)不一样吧。由于录制用的第三方设备,不能修改参数,只能自己使用工具转码了。

FFmpeg

网上一搜索,就找到了大名鼎鼎的 FFmpeg ,好像 google 的 youtube 后台也是用的这个转码,国内的很多视频播放器核心也是这个。有了这个实现起来就非常简单了。FFmpeg 转码时占用 CPU 很高,可以到 100%,也不知道该怎么解决此问题。转码只要一条指令就行了:

ffmpeng.exe -i source.mp4 -c:v libx264 -crf 24 destination.flv

这是最简单的设置,更多可以去官网看详细的参数,其中 -crf 很重要,是控制转码后视频的质量,质量越高,文件也就越大。

The range of the quantizer scale is 0-51: where 0 is lossless, 23 is default, and 51 is worst possible. A lower value is a higher quality and a subjectively sane range is 18-28. Consider 18 to be visually lossless or nearly so: it should look the same or nearly the same as the input but it isn‘t technically lossless.

官网的解释(翻译):

此值的范围是 0 到 51:0 表示高清无损;23 是默认值(如果没有指定此参数);51 虽然文件最小,但效果是最差的。

值越小,质量越高,但文件也越大,建议的值范围是 18 到 28。而值 18 是视觉上看起来无损或接近无损的,当然不代表是数据(技术上)的转码无损。

Coding:

实现起来也是很简单,只要使用 Processs 后台转码就行,请看 FfmpegHelper:

 1 using System;
 2 using System.Configuration;
 3 using System.IO;
 4 // reference https://github.com/LeafDuan/WebPrint/tree/master/WebPrint.Framework
 5 using WebPrint.Framework;
 6 // reference https://github.com/LeafDuan/WebPrint/tree/master/WebPrint.Logging
 7 using WebPrint.Logging;
 8
 9 namespace WebPrint.CameraServer.Helper
10 {
11     public class FfmpegHelper
12     {
13         private static readonly ILogger Logger = LoggerHelper.GetLogger(typeof (FfmpegHelper));
14
15         private static string Ffmpeg
16         {
17             get { return ConfigurationManager.AppSettings["ffmepg"]; }
18         }
19
20         private static string Args
21         {
22             get { return ConfigurationManager.AppSettings["args"]; }
23         }
24
25         private static string FlvPath
26         {
27             get { return ConfigurationManager.AppSettings["flv"]; }
28         }
29
30         public static string DecodeMp4ToFlv(string mp4, int timeout = 0)
31         {
32             var ffmpeg = "\"{0}\"".Formatting(Ffmpeg);
33             var flv = Path.Combine(FlvPath, (Path.GetFileNameWithoutExtension(mp4) ?? string.Empty) + ".flv");
34             var args = Args.Formatting("\"{0}\"".Formatting(mp4), "\"{0}\"".Formatting(flv));
35             string output, error;
36             if (timeout <= 0)
37                 timeout = 5*60*1000; // timeout = 5 minutes
38             ProcessHelper.Process(ffmpeg, args, timeout, out output, out error);
39             if (!error.IsNullOrEmpty())
40             {
41                 Logger.Error("{0}{1} : {2}{0}".Formatting(Environment.NewLine, "FFmpeg", error));
42             }
43
44             return flv;
45         }
46     }
47 }

倒是其中 Process 的实现需要技巧,尤其是针对 output、error 和 timeout 的处理。如果不使用 AutoResetEvent ,process 很容易卡死在 error output 上(IO blocked)。其中针对超时,做了一个处理,就是 kill 掉 process ,免得引起资源霸占和泄露(过多 ffmpeg 进程)。

附:Flash 推荐

可以转码成 html 5 支持的 H.264,也可以其他格式,如 flv。为了兼容 IE6 及以上浏览器,只能使用 flash 播放的方式了。使用的是开源的 vcastr22.swf,可能由于开源,项目现在没有人维护了。

最后吐槽一句:盼 IE9 以下的版本早日寿终正寝。为了随窗口以 16:9 的尺寸自动缩放,兼容 IE6、7 的 css 和 js 是写得累死了。因为非专业前端,找资料都累死了。

时间: 2024-10-14 15:00:56

利用 FFmpeg 将 MP4 转成 FLV的相关文章

java利用ffmpeg把图片转成yuv格式

安装ffmpeg: 安装目录:/usr/share/ffmpeg 创建ffmpeg目录,解压ffmpeg-3.4.1.tar.bz2 tar -xjvf ffmpeg-3.4.1.tar.bz2 下载yasm-1.3.0.tar.gz 解压 tar -xvzf yasm-1.3.0.tar.gz cd yasm-1.3.0/ ./configure make make install 编译参数都是默认的,直接安装到系统中即可,安装成功之后继续回到ffmpeg解压后的目录,执行下面命令编译并安装:

(转)MP4文件两种格式AVC1和H264的区别及利用FFMPEG demux为h264码流事项

出自:http://www.mworkbox.com/wp/work/314.html 2013-05-04 MP4的视频H264封装有2种格式:h264和avc1,对于这个细节,很容易被忽略.笔者也是在改编LIVE555流媒体时,增加mp4文件类型支持时遇到了该问题. (一)首先,从原理上了解一下这2种格式的区别:AVC1 描述:H.264 bitstream without start codes.一般通过ffmpeg转码生成的视频,是不带起始码0×00000001的.H264 描述:H.2

利用FFMPEG简单分离音视频数据流

上一篇文章我们搭好了环境并编译出所需的ffmpeg库,本篇我们讨论如何利用ffmpeg提供的API函数进行多媒体文件的解封装(demux)过程.在讲解之前,我们需要了解一些基本的多媒体文件知识,大虾请飘过. 容器格式:不管是音频文件还是视频格式的文件,都是一个多媒体的容器,即container,比如常见的视频容器格式有avi.mp4.mkv.flv.rm/rmvb.mov.ts.vob.dat,音频容器格式有MP3.WAV.AAC.APE,FLAC等等,它容纳了视频.音频.字幕(subtitle

利用FFmpeg玩转Android视频录制与压缩(二)&lt;转&gt;

转载出处:http://blog.csdn.net/mabeijianxi/article/details/72983362 预热 时光荏苒,光阴如梭,离上一次吹牛逼已经过去了两三个月,身边很多人的女票已经分了又合,合了又分,本屌依旧骄傲单身.上一次啊我们大致说了一些简单的FFmpeg命令以及Java层简单的调用方式,然后有很多朋友在github或者csdn上给我留言,很多时候我都选择避而不答,原因是本库以前用的so包是不开源的,我根本改不了里面东西.但是这一次啊我们玩点大的,我重新编译了FFm

史林枫:C#.NET利用ffmpeg操作视频实战(格式转换,加水印 一步到位)

ffmpeg.exe是大名鼎鼎的视频处理软件,以命令行参数形式运行.网上也有很多关于ffmpeg的资料介绍.但是在用C#做实际开发时,却遇到了几个问题及注意事项,比如如何无损处理视频?如何在转换格式的同时添加水印,以提升处理效率?,ffmpeg的版本应该选择什么版本?.今天史林峰将用实战的方式来探索C#操作ffmpeg的奥秘. 关于ffmpeg的使用及其参数命令,这里就不做过多介绍了.主要以项目实战中为主. 因工作需要,笔者手头有近300部短视频需要处理,在网上找了不少工具,虽然能用,但是用起来

Windows 下 ffmpeg 转 mp4

最近在研究所有视频格式转  mp4 因为html5 只支持mov MP4 等格式..查阅了 很多资料发现  转成flv  很简单.. 可是要转 mp4 就难了... 经过我不屑的努力..终于转换成功了.. 命令如下: FFMPEG -i D:\5367002155592.wmv -c:v libx264 -strict -2 D:\test.mp4 ps: 我是Windows 命令窗口里面转换的. 你要用ffmpeg 首先记得在Windows下安装 .安装方法自行百度. 话说 x264 跟h26

[转载]用 FFMPEG 合并 MP4 视频

因为 ffmpeg 是支持切分 mp4 视频的,所以我就理所当然的以为 ffmpeg 是支持视频合并.直到今天同事找我问方法,才发现一直以为的方法是错误的, mp4 不支持直接 concate(丢人了...),赶紧补了一下能量,从网上抓来了多种实现. 注: 这里的 mp4 指的是网上最多见的 h264+aac mpeg4 容器的方式 1). ffmpeg + mpeg 这种是网上最常见的,基本思路是将 mp4 先转码为 mpeg 文件,mpeg是支持简单拼接的,然后再转回 mp4. ffmpeg

利用FFMPEG命令进行文件分割

ffmpeg -ss 00:00:00 -i input.mp4 -c copy -t 60 output.mp4 -ss 表示视频分割的起始时间,-t 表示分割时长,同时也可以用 00:01:00表示 注意 :-ss 要放在 -i 之前 对于普通的视频分割这个命令可能够用了 但是 如果你想要连续风格一段视频,简单的使用此命令就会发现一个问题:连续分割的视频之间存在细微的交集 原因: 视频的开始都是一个关键帧,如果视频的第一帧不是关键帧就会导致视频播放的前面简短画面模糊不清,所以为了让视频不会出

Java也疯狂-分享利用ffmpeg做视频转换的工具

朋友需要经常将视频统一转换为mp4格式,市面上的工具很多,但是转换的体积.自动化程度等都不好,于是花了一个小时给朋友写了个给予ffmpeg的批量转换工具,功能简单但是很实用,也正好给学习Java的同学一些参考,其中使用到了swing.简单的多线程(基于Timer).内部类嵌套实现.线程下如何实现多线程数据的显示.windows的一些操作(读取环境变量.调用外部程序等),ffmpeg是一个非常有用的工具,尤其对于开发者而言.程序运行的效果如下 话不多说,直接上完整代码,复制可以运行(需要ffmpe