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

FFmpeg

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

ffmpeg.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 usingSystem;2 usingSystem.Configuration;3 usingSystem.IO;4 //referencehttps://github.com/LeafDuan/WebPrint/tree/master/WebPrint.Framework

5 usingWebPrint.Framework;6 //referencehttps://github.com/LeafDuan/WebPrint/tree/master/WebPrint.Logging

7 usingWebPrint.Logging;8

9 namespaceWebPrint.CameraServer.Helper10 {11 public classFfmpegHelper12 {13 private static readonly ILogger Logger = LoggerHelper.GetLogger(typeof(FfmpegHelper));14

15 private static stringFfmpeg16 {17 get { return ConfigurationManager.AppSettings["ffmepg"]; }18 }19

20 private static stringArgs21 {22 get { return ConfigurationManager.AppSettings["args"]; }23 }24

25 private static stringFlvPath26 {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 stringoutput, error;36 if (timeout <= 0)37 timeout = 5*60*1000; //timeout = 5 minutes

38 ProcessHelper.Process(ffmpeg, args, timeout, out output, outerror);39 if (!error.IsNullOrEmpty())40 {41 Logger.Error("{0}{1} : {2}{0}".Formatting(Environment.NewLine, "FFmpeg", error));42 }43

44 returnflv;45 }46 }47 }

View Code

倒是其中 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 是写得累死了。因为非专业前端,找资料都累死了。

感谢

感谢 @eflay 的解决思路,“通过转封装的方式,以复制的效率实现MP4转FLV”。本人不是很懂这些视频的编码,因此没有想到这么好的解决方式。

ffplay flv mp4 转_利用 FFmpeg 将 MP4 转成 FLV相关推荐

  1. 利用ffmpeg将m3u8下载成mp4(利用ps1脚本解析json批量下载)

    利用ffmpeg将m3u8下载成mp4 安装ffmpeg JSON文件示例(自行抓取m3u8) powershell脚本 打开powershell运行 安装ffmpeg 自行baidu JSON文件示 ...

  2. java利用FFMpeg将mp4转换为gif

    网上和官方资料整合 存在问题,在不丢帧的情况下转换后的gif会比原始mp4文件大很多. package jinx; import java.io.BufferedReader; import java ...

  3. 使用jsmpegjs前,先把利用 ffmpeg 将 MP4 格式的文件转换为 ts 格式

    利用 ffmpeg 将 MP4 格式的文件转换为 TS 格式 ffmpeg官网:http://ffmpeg.org/download.html ffmpeg下载地址: https://github.c ...

  4. 利用ffmpeg 把.mp4转换为.flv

    1. 下载安装 ffmpeg Download FFmpeg windows下载编译之后的exe文件,放到path环境变量中. Linux 下 tar xvf xxx.tar.bz2 ./config ...

  5. ffmpeg实现摄像头拉流_利用ffmpeg一步一步编程实现摄像头采集编码推流直播系统...

    了解过ffmpeg的人都知道,利用ffmpeg命令即可实现将电脑中摄像头的画面发布出去,例如发布为UDP,RTP,RTMP等,甚至可以发布为HLS,将m3u8文件和视频ts片段保存至Web服务器,普通 ...

  6. ffmpeg 切片花屏_利用ffmpeg解码H264,花屏,该如何解决

    利用ffmpeg解码H264,花屏 UINT CMP4File::VideoCap_Thread_Fun(void* pParam) { CMP4File  *pMP4File=(CMP4File*) ...

  7. 利用ffmpeg将mp4视频转换成多张jpg图片

    分离视频音频流 ffmpeg -i input_file -vcodec copy -an output_file_video //分离视频流 ffmpeg -i input_file -acodec ...

  8. python读取图片文字为表格_利用python将图片转换成excel文档格式

    前言 本文主要介绍了关于利用python将图片转换成excel文档的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 实现步骤 读取图像,获取图像每个像素点的RGB值: 根据 ...

  9. python将excel转换成图片格式_利用python将图片转换成excel文档格式

    前言 本文主要介绍了关于利用python将图片转换成excel文档的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 实现步骤 读取图像,获取图像每个像素点的RGB值: 根据 ...

最新文章

  1. 用栈实现形如a+bb+a@的中心对称字符的检验
  2. Orleans解决并发之痛(四):Streams
  3. 基于结构体的二进制文件读写
  4. lt;++mysql_php+js+mysql设计的仿webQQ-lt;1gt;邮箱验证
  5. 实战:Docker容器虚拟化技术(使用DockerFile构建镜像并搭建 swarm+compose集群)5
  6. 关于 Flutter Layout(转载)
  7. html整体移动,html 可以拖动多个div
  8. 体验 Vista Speech Recognition,使梦想成为可能
  9. poj 3678 Katu Puzzle 2-SAT
  10. idea创建maven工程_maven创建父子工程 springboot自动配置
  11. 安卓模拟器刷小米系统_小米5x原生rom系统刷机-小米5X MIUI10刷机包下载V9.7.21最新版-西西软件下载...
  12. Java Swing Mysql学生签到考勤系统
  13. 复旦退休教授直播间吸烟被举报:此前因违规吸烟被学校要求做检讨
  14. t3服务器一登录就运行时错误,用友T3软件登陆系统管理提示运行时错误3709
  15. dz3 php post 登录,discuz X3用户登录uc_user_login()函数详解
  16. 雷达原理 知识点汇总
  17. 读《蔡康永的说话之道》
  18. 你为什么始终做不好会议营销?「会议营销」电子书免费下载
  19. 好书推荐——从零开始学习 Julia 编程、数学和数据科学。
  20. 网站建设-简单动态网站搭建

热门文章

  1. 累加器使用的注意点及自定义累加器
  2. php 斜杠字符,php-如何编码包含正斜杠的查询字符串?
  3. C++ 使用Windows API 打开VSPD虚拟串口失败
  4. 本地spa应用的nginx简单配置
  5. Android蓝牙开发系列文章-蓝牙mesh(一)
  6. matlab 双y轴对数坐标 误差线,matlab双y轴添加误差棒(转载)
  7. 一阶电路实验报告心得_电路实验心得体会范文3篇
  8. LaTeX插入知网参考文献
  9. 手机自动识别软件项目举例
  10. 数据可视化之中国足球队在国际足联及亚洲的历史排名看这儿