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

时间: 2024-11-03 10:25:41

ffmpeg使用转码学习的相关文章

h264-请教关于ffmpeg解码rtp码流的问题

问题描述 请教关于ffmpeg解码rtp码流的问题 小弟最近在学习网络视频流传输,有个疑问如下:用rtp流封装h264码流,rtp协议中有sequence和timestamp,我想请问这两者和PTS和DTS有关联吗?如果用ffmpeg解码,是否是按rtp包的有效数据加上0x00000001扔给解码器就行?SPS以及PPS中的数据需要初始化给ffmpeg吗? 本人小白,希望各位多多指教,谢谢! 解决方案 组包之后 Nal前面加上0x00000001, 扔个解码器 就行 了

STL源码学习——Lists(链表)

STL源码学习--Lists(链表) 今天突然想起来看看开源项目,找了找最后决定好好看看经典的STL喵~ 和STL里的代码比起来我突然觉得以前写的代码也太不规范了喵,估计很多ACMer都一样吧喵. 先从简单的看.先挑了一发list的源码来看.总结如下: 欢迎大家一起讨论喵~ 1 :list是用双向循环链表实现的,就是说 list.end()+1 == list.begin() 2 :list中有一个关键结点,这个结点是 list.end() 3 :在看了list中的erase函数后,发现这个函数

Redis源码学习——BIO

Redis源码学习之BIO BIO顾名思义,background IO,是redis中运行的后台IO. 网上千篇一律的说法是redis是单线程单进程. 实际上redis运行过程中并不是严格单进程单线程应用.Redis中的多进程: 在写入备份(RDB,AOF)的时候,会fork出子进程进行备份文件的写入.Redis中的多线程: AOF的备份模式中,如果我们设置的是AOF_FSYNC_EVERYSEC(每秒备份一次,这个设置可理解为弱同步备份),redis会create一个backgroud线程,在

DotText源码学习——ASP.NET的工作机制

--本文是<项目驱动学习--DotText源码学习>系列的第一篇文章,在这之后会持续发表相关的文章. 概论 在阅读DotText源码之前,让我们首先了解一下ASP.NET的工作机制,可以使我们更好的理解.ASP.NET是Web服务器(IIS)的 ISAPI(Internet Server API)扩展.当IIS接收到客户端浏览器发来的请求后,它根据请求的文件类型确定由哪个ISAPI扩展来处理该请求,并将请求转发给ASP.NET(如 果是ASP.NET处理的相应文件类型的话,如*.aspx.*.

Hadoop源码学习:RPC

Hadoop源码学习:RPC Hadoop RPC使用java NIO编写,达到高性能,轻量级,可控性. 主要分为四层:序列化层,函数调用层,网络传输层,服务器端处理框架 序列化层:实现Writable接口 函数调用层:java反射机制和动态代理实现函数调用 网络传输层:使用Socket机制 服务器端处理框架:基于Reactor设计模式的事件驱动I/O模型 如何使用Hadoop RPC: RPC Server: 1.定义一个协议,实现VersionedProtocol接口, public int

Java集合源码学习(二)ArrayList分析

Java集合源码学习笔记(二)ArrayList分析 1.关于ArrayList ArrayList直接继承AbstractList,实现了List. RandomAccess.Cloneable.Serializable接口, 为什么叫"ArrayList",因为ArrayList内部是用一个数组存储元素值,相当于一个可变大小的数组,也就是动态数组. (1)继承和实现 继承了AbstractList,实现了List:ArrayList是一个数组队列,提供了相关的添加.删除.修改.遍历

参数-ffmpeg API转码码率怎么控制

问题描述 ffmpeg API转码码率怎么控制 ffmpeg API转码码率设置为450k,但是mediainfo查看时有2000多k,用ffmpeg EXE转码出来的码率就很正常,请问是不是参数设置有问题?

有谁写过asp.netsql2000进销存的,我购源码学习?

问题描述 有谁写过asp.netsql2000进销存的,我购源码学习?我最近想学ASP.NET看了很多书,都不行.都差不多.所以想购源码来学习,价格在3000左右,要求商业,但不要求很完善的QQ:421520476 解决方案 解决方案二:但不要求很完善的????商业项目哪个不是比较完善后才出"厂"的,你去51aspx找一下吧,应该有供学习的--

Android源码学习之组合模式定义及应用_Android

组合模式定义: Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly. 将对象组合成树形结构以表示"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 如上图所示(截取自<Head First De