【FFMPEG】【ARM-Linux开发】fmpeg安装第三方编码器(encoder)库,ffmpeg编码h264(完)...

news/2024/7/10 19:10:06 标签: ffmpeg, 操作系统, 嵌入式

fmpeg安装第三方编码器(encoder)库,ffmpeg编码h264(完)

ffmpeg安装第三方编码器(encoder)库

关键词:ffmpeg、编码h264、第三方encoder

    安装好了ffmpeg后,如果你使用ffmpeg工具去把某个视频文件转成h264视频编码、mp3音频编码or其他ffmpeg自身不带的xxx编码类型,就会看到报错信息,unknown encoder 'xxx'。此刻你需要的只要去安装其他的编码器就行了,本质上其实是把其他的编码器以库的形式安装好,例如,把正确的libx264.so or libx264.a存放在/usr/lib下 or /usr/local/lib下。

    举两个例子吧,视频方面的编码器就拿h264来说,音频方面的例子就拿mp3(mp3lame)来说。

    扫盲,Linux下安装一个正规的软件,一般都是三部曲,①、【./configure】(加一些可能的参数,比如enable一些功能,disable一些功能,究竟有哪些功能可以开启和关闭呢?一般通过./configure --help命令来查询),②、【make】(编译),③、【sudo make install】(把生成的二进制应用程序文件和.so和.a复制到/usr/local/下)

     一、h264

     动手搜一下ffmpeg的工程代码库,会发现每个codec都有一下几个成员变量,但是有好几个codec缺少encoder,h264就是其中一个了。先不管什么原因,ffmpeg没有原生的支持h264,但是你可以查看一下avcodec_register_all这个API,会发现一大片的REGISTER_ENCODER(XXX, xxx)

REGISTER_DECODER(XXX, xxx)

这里分很多块,例如/* video codecs */,/* audio codecs */,/* external libraries */

但是你在/* video codecs */这一块却看不到h264的REGISTER_ENDECODER (H264, h264);这句话,如果你坚持往下翻,你会在/* external libraries */这块里面发现REGISTER_ENCODER (LIBX264, libx264);所以ffmpeg是有给h264准备好了接口的,但是需要第三方库来支持。

    回到重点,怎么装呢?

    1.先下载x264的工程代码,【Git clone git://git.videolan.org/x264.git】。

    2.进入x264目录,然后./configure --help看看它的帮助信息,我们这里需要的是x264以.so or .a的形式来支援ffmpeg,所以一般就关注shared和static关键词就可以了。执行./configure --enable-shared --enable-static就行了。

    3.完了make && sudo make install就可以了。

    你会发现我们在./configure的时候没有指定前缀--prefix=/usr,很明显,libx264.so和libx264.a就会复制到/usr/local/lib下去,记住这里,等下会因为这里要做一些修改。

    二、mp3lame

    上面说了h264,相信mp3lame理解起来就简单多了。

    1.先下载mp3lame的工程代码,http://sourceforge.NET/projects/lame/files/lame/,为什么这里要显得多余的讲一下mp3lame呢,是这样的。大家可以看到x264用的是git,mp3lame是用的sourceforge,不妨再多说一个faac(也是一种原生ffmpeg不支持的音频codec),faac用的是http://sourceforge.Net/projects/faac/files/faac-src/,所以每一种codec或者很重要的软件都有一个团队或者社区在维护,所以需要什么东西,尽量去sourceforge或者git上找,其他地方找的可能不够新,可能不完整不正确。

    2.然后也是./configure --help先,看看哪些功能是我们需要打开关闭的

    3.完了make && sudo make install就可以了。

    很明显,我们又没有指定--prefix-/usr,所以mp3lame的libmp3lame.so和libmp3lame.a就被赋值到了/usr/local/lib下了。

 

    三、重新编译ffmpeg

    1.进入ffmpeg目录,./configure --enable-gpl --enable-libx264 --enable-libmp3lame,然后就生成了新的makefile了。

    2.执行sudo make clean && make sudo make install。

    3.这样ffmpeg就被重新编译了,完了就可以验证一下,使用ffmpeg工具,把某个视频文件中的视频流转码成h264格式,音频流转码成mp3lame格式,不妨试试。

    4.如果你真的尝试了,你应该会看到类似于“libxxx.so找不到”的错误提示,解决办法如下:

    (1).表象:ffmpeg运行的时候试图去链接libxxx.so,但是却找不到相应的libxxx.so。

    (2).疑惑:我之前明明安装了libxxx.so的。

    (3).原因:程序运行的时候默认是去/usr/lib下找libxxx.so,但是我们之前安装的确实在/usr/local/lib下,所以造成这个报错。

    (4).解决办法:有很多,我说一种我亲测过的。

    在/etc/ld.so.conf文件中添加一行/etc/ld.so.conf,当然是用root用户啦。然后执行ldconfig命令使得刚才的修改生效,完了再运行ffmpeg的转码命令试试,可以了吧。

    

    之前我尝试过用ffplay来播放一个h264编码的视频,结果当然是可以播放,我就天真的以为ffmpeg支持h264了,其实不然,ffmpeg主要还是用来解码,所以部分格式的encoder却没有,所以才会有第三方库支援,为什么原生ffmpeg不支持某些格式呢?原因我暂时不知道。为了解决ffmpeg可以编码h264这个问题,我在网上搜索一些资料,然后总结成上文,在此过程中我还收获了一些Linux的知识,也已经写出。



补充三点:

H264 下载地址:http://www.videolan.org/developers/x264.html

aac下载地址:http://sourceforge.net/projects/faac/files/faac-src/faac-1.28/faac-1.28.tar.gz/download

找不到库:vim /etc/ld.so.conf,加入:/usr/local/lib,执行ldconfig


aac:./configure --enable-shared  --enable-static 

264:./configure --enable-shared  --enable-static  --disable-asm

ffmpeg:./configure --enable-gpl --enable-libx264  --enable-libfaac  --enable-nonfree --disable-yasm 

转载于:https://www.cnblogs.com/huty/p/8517588.html


http://www.niftyadmin.cn/n/1191086.html

相关文章

数据存储

数据存储分为web storage 和 cookie web storage 和 cookie区别 Web Storage的概念和cookie相似,区别是它是为了更大容量存储设计的。Cookie的大小是受限的,并且每次你请求一个新的页面的时候Cookie都会被发送过去,这样无形中浪费了带宽&a…

iOS初级开发学习笔记:贝塞尔曲线的绘制学习

本文参考此文参考 我们在项目中会接触到一些曲线的绘制,最初接触这个概念是因为有一个在屏幕右边的按钮,因为贴着屏幕,按钮右边是没有圆角的,而左上和左下是圆角,类似: 还没知道贝塞尔曲线绘制之前&#xf…

php中文转换编码函数

$filename $list->filename; // 获取文件名字if(preg_match("/[\x80-\xff]/",$filename)){ // 如果是中文,将其转码$fileNameiconv("utf-8","gb2312",$filename);}else{$fileName $filename; …

关于Guava类库中Lists.transform的问题解析

这里讲述是的google的Guava类库中的一个需要注意的问题,如下: public class GuavaListTest {public static class TestDO {private String name;private int age;private String description;public TestDO(String name, int age, String description) {…

Spring学习详解(1)——Spring入门详解

2019独角兽企业重金招聘Python工程师标准>>> 一:spring的基本用法: 1,关于spring容器: spring容器是Spring的核心,该 容器负责管理spring中的java组件, ApplicationContext ctx new ClassPath…

正则.01

正则.01 表达式加上参数g之后,表明可以进行全局匹配,注意这里“可以”的含义。我们详细叙述:1)对于表达式对象的exec方法,不加入g,则只返回第一个匹配,无论执行多少次均是如此,如果加…

转:浅谈图片服务器的架构演进

现在几乎任何一个网站、Web App以及移动APP等应用都需要有图片展示的功能,对于图片功能从下至上都是很重要的。必须要具有前瞻性的规划好图片服务器,图片的上传和下载速度至关重要,当然这并不是说一上来就搞很NB的架构,至少具备一…

后端开发应该掌握的Redis基础

在上一篇文章中,我们简单地讲了一下Redis的应用场景、安装、如何连接等比较基础的知识,那么在这篇文章,我们就再接再励,继续Redis基础知识的学习吧。 在这篇文章中,我们来讲一讲Redis的数据结构和通用命令。 Redis的数…