ffmpeg使用转码学习
ffmpeg在官网上描述自身:是一个对视频和音频进行记录,转换,流化的完整的跨平台解决方案。事实上,现在有很多工具都是基于ffmpeg来进行视频音频的处理工具的。比如鼎鼎大名的格式工厂,就是使用ffmpeg来作为内核的转码工具。
理解一些音视频的编码知识。
我们平时看的视频文件格式:mp4/rmvb/mkv/avi其实是一个容器。这个容器中装的东西分为两大类:音频和视频。对于视频这部分,它包含的编码格式有:H264/H265/VP8/VC1等。对于音频这个部分,它包含的编码格式有:AAC/MP3/mid等。所以说,我们平常笼统说的【视频格式】其实包含了三个部分:视频编码,音频编码,容器格式。这里说的【编码】其实包含的是两层:编码和解码。比如视频编码,就是将视频图像转换成为二进制数据的过程。视频解码就是将二进制数据转化成图像的过程。音频编码也是一样的。那么我们看一个视频文件的时候,能同时看到声音和图像,就说明我们至少同时存在视频编码和音频编码两组数据。那么这两组数据是按照什么规则组织起来的呢?这就要看【容器格式】的规定了。容器里面存放的数据可能采用多种不同的编码方式。比如avi文件存放的通常是xvid或者divx编码的视频和mp3编码的音频。rmvb 文件里面存放的通常是 RV40 编码的视频和 cook 编码的音频。mp4 文件里面通常存放的是 H.264 编码的视频和 AAC 编码的音频。mkv 文件里面存放的则可能包含前面各种。
如果你安装了ffmpeg,你使用ffmpeg -codecs就可以看到ffmpeg支持的哪些音视频编码了(几乎已经囊括了大部分现有编码了)。截取其中的一部分:
Codecs:
D..... = Decoding supported (支持解码)
.E.... = Encoding supported (支持编码)
..V... = Video codec (视频编码)
..A... = Audio codec (音频编码)
..S... = Subtitle codec (字幕编码)
...I.. = Intra frame-only codec (帧编解码)
....L. = Lossy compression (有损压缩的编码)
.....S = Lossless compression (无损压缩的编码)
-------
D.V.L. 4xm 4X Movie
D.VI.S 8bps QuickTime 8BPS video
.EVIL. a64_multi Multicolor charset for Commodore 64 (encoders: a64multi )
.EVIL. a64_multi5 Multicolor charset for Commodore 64, extended with 5th color (colram) (encoders: a64multi5 )
D.V..S aasc Autodesk RLE
DEVIL. amv AMV Video
D.V.L. anm Deluxe Paint Animation
D.V.L. ansi ASCII/ANSI art
好了,那我们经常说的转码其实就是这么个过程:
原视频 -- 解码 -- 像素数据 -- 编码 -- 目标视频
原音频 -- 解码 -- 音频数据 -- 编码 -- 目标音频
我们使用aac转mp3的例子来看ffmpeg在音频转码方面的使用。
aac名字就很高大上,高级音频编码,出现于1997年,出现的目的是为了取代MP3格式。相比于MP3格式来说,它的压缩算法更优秀,是一种高压缩比的编码。它是苹果和诺基亚等公司共同开发的,现在苹果手机上的itunes音乐播放器都是支持和使用AAC文件的。
但是,aac格式的音频文件在html5中不是可以被所有的浏览器所支持的。浏览器对音频文件的支持如下:

再回到ffmpeg工具,它的格式是这样的:
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
所以假设我有个aac文件在这个位置:
/home/web/mycareer/upload/61/1d0452670723c3ba2e1b10d02d789c61.aac
我需要将它转换成mp3文件:
/home/web/mycareer/upload/61/1d0452670723c3ba2e1b10d02d789c61.mp3
音频的参数有这么几个:http://ffmpeg.org/ffmpeg.html#Audio-Options
首先ffmpeg自身有带aac的解码器,但是没有带mp3的编码器,需要编译的时候带上--enable-libmp3lame
当然这个需要你先安装libmp3lame
curl -L -O http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
tar xzvf lame-3.99.5.tar.gz
make
make install
然后在ffmpeg编译安装的时候带上:--enable-libmp3lame
然后ffmpeg的命令就是:
ffmpeg -i /home/web/mycareer/upload/61/1d0452670723c3ba2e1b10d02d789c61.aac -acodec libmp3lame /home/web/mycareer/upload/61/1d0452670723c3ba2e1b10d02d789c61.mp3
记得这里要说明下-acodec libmp3lame
转码就完成了。
参考文章:
http://apple4us.com/2011/01/html5-video-war-part-1.html
http://blog.csdn.net/leixiaohua1020/article/details/11842919
http://blog.csdn.net/axdc_qa_team/article/details/4204358
ffmpeg使用转码学习的更多相关文章
- 最简单的基于FFMPEG的转码程序
本文介绍一个简单的基于FFmpeg的转码器.它可以将一种视频格式(包括封转格式和编码格式)转换为另一种视频格式.转码器在视音频编解码处理的程序中,属于一个比较复杂的东西.因为它结合了视频的解码和编码. ...
- iOS: FFmpeg编译和使用 学习
ffmpeg是一个多平台多媒体处理工具,处理视频和音频的功能非常强大.目前在网上搜到的iOS上使用FFMPEG的资料都比较陈旧,而FFMPEG更新迭代比较快: 且网上的讲解不够详细,对于初次接触FFM ...
- FFmpeg简单转码程序--视频剪辑
学习了雷神的文章,慕斯人分享精神,感其英年而逝,不胜唏嘘.他有分享一个转码程序<最简单的基于FFMPEG的转码程序>其中使用了filter(参考了ffmpeg.c中的流程),他曾说想再编写 ...
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- jQuery源码学习感想
还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码, ...
- MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)
前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...
- MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)
前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...
- MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码)
前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个 ...
- MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)
前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...
随机推荐
- fuck me on github
前几天写了一篇<博客园添加Fork me on GitHub彩带>,有博友评论,说他看到有的彩带上写着“Fuck me on GitHub”,当时我就笑喷了,有意思,哈哈! 昨天正好有时间 ...
- HTML5之Canvas时钟(网页效果--每日一更)
今天,带来的是使用HTML5中Canvas标签实现的动态时钟效果. 话不多说,先看效果:亲,请点击这里 众所周知,Canvas标签是HTML5中的灵魂,HTML5 Canvas是屏幕上的一个由Java ...
- 使用curl 下载HTML
简单的一个curl小例子: #include <iostream> #include <string> #include <sstream> #include &l ...
- nw.js FrameLess Window下的窗口拖拽与窗口大小控制
nw.js FrameLess Window下的窗口拖拽与窗口大小控制 很多时候,我们觉得系统的Frame框很难看,于是想自定义. 自定义Frame的第一步是在package.config文件中将fr ...
- 《C#图解教程》读书笔记之四:类和继承
本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.万物之宗:Object (1)除了特殊的Object类,其他所有类都是派生类,即使他们没有显示基类定义. ( ...
- 如何用django开发一个简易个人Blog
功能概要:(目前已实现功能) 公共展示部分: 1.网站首页展示已发布的博客记录,包括名称.摘要信息.发布日期.阅读量及评论数. 2.首页文章列表可按照分类筛选. 3.点击标题或阅读全文链接,进入博客阅 ...
- Stealth视频教程学习笔记(第二章)
Stealth视频教程学习笔记(第二章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...
- Linux grep总结(转)
源自:http://www.cnblogs.com/end/archive/2012/02/21/2360965.html 1.作用Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表 ...
- 对Google cloud platform 做了点研究
Google也推出了云计算基础服务, 加上微软Azure,亚马逊AWS, 都齐活了. 下面是研究了一下对其的一个初步了解. 计算: Compute Engine IaaS平台,提供VM,操作灵 ...
- Thrift架构~从图中理解thrift,它事实上是一种远程过程调用
thrift为我们简化了tcp通讯,它可以使用我们方便的建立各种语言的服务端与客户端,并实现客户端对服务器的远程过程调用,简单的说就是服务器通过thrift架构对外开放一些接口,并自己实现这些接口,如 ...