fdkaac编译
㈠ linux下编译ffmpeg时关于configure的问题.
你准备工作没做好吧!!
先编译安装Yasm。
然后编译安装H.264 (也就是x264)。
再编译安装AAC audio encoder (fdk-aac)。
编译安装libmp3lame (MP3 audio encoder)。
编译安装libopus (Opus audio decoder and encoder)。
编译安装libvpx (VP8/VP9 video encoder and decoder)。
做后编译安装ffmpeg。
其中1-6你可以选择编译安装,也可以使用源直接安装。安装后了再编译安装ffmpeg
你使用 sudo ldconfig -p |grep libx264 看看你的libx264是否正确安装.
你编译安装x264的时候可以使用2中方式都安装。
先
cd ../x264
./configure --enable-shared
make
make install
最后
cd ../x264
make distclean
./configure --enable-static
make
make install
㈡ 如何使 vlc 支持 fdk-aac 编码windows平台
可能是由于fdk-aac开源协议的原因,VLC默认是不支持fdk-aac编码的,fdk-aac 是非常优秀的AAC编码库,并且支持AAC-LD AAC-ELD, 对于要求低延迟的场景下很有用。
可以通过修改VLC的编译脚本,并加入fdkaac库来使用VLC支持fdkaac编码器。
我是在64位的ubuntu16.04下编译的,vlc的编译方法参考VLC官网的编译文档。
1 修改vlc/extras/package/win32/configure.sh , 加入--enable-fdkaac, 这样VLC就会编译fdkaac这个模块。
执行make,会出现编译错误
as/package/win32/../../../moles/codec/fdkaac.c:56:32: fatal error: fdk-aac/aacenc_lib.h: No such file or directory
这是因为缺少fdk-aac库相关的头文件。
2 编译fdk-aac库
下载源码https://github.com/mstorsjo/fdk-aac.git
在terminal下进入源码目录,输入
mkdir winBuild
cd winBuild
../configure --host=i686-w64-mingw32 --prefix=VLCPATH/contrib/i686-w64-mingw32
make install
VLCPATH 替换成VLC代码的路径
3 编译VLC代码
make packag-win32-zip
这时应该可以编译通过了, 在mole/codec/ 目录下会生成libfakaac_plugin.dll文件。
还需要把这个模块依赖的VLCPATH/contrib/i686-w64-mingw32/libfdk-aac-1.dll动态库复制到这个目录下。
现在VLC就可以支持fdk-aac编码了。
㈢ 怎样用AACLib V1.0在Android上音频编码解码
这几天在 android上的音频项目,顺便把用到的aac编解码库封装了一下,有需要的可以从上面下载。当然是没有本事自己写编解码器的,还是用FFmpeg + FDK_aac来做。下面介绍一下其java接口的使用。java库见libaac.jar文件,把libaac.jar加到 libs目录下,把libaac.so加到 libs/armeabi目录即可使用。
AAC编码:
(1) 创建一个Encoder对象作为成员变量
aac.Encoder encoder;
(2) 初始化它
encoder = new aac.Encoder();
if(! encoder.open(11025, 1))
{
Log.d("mylog", "failed to open encoder !\n");
encoder = null;
}
这里要指定输入音频源(PCM格式)的sampe_rate和channel个数,如果为CHANNEL_OUT_MONO,则channel=1,否则为2。 sample_rate一般设置为11025,因为手机性能有限,设置太高的话也处理不过来,而且处理人声的话11025也是足够了。
(3) 编码
把接收到PCM数据交给encoder来处理即可,要求输入源为ENCODING_PCM_16BIT,即每个sample是16BIT的。这个encoder对象内有2个缓冲区:inbuf, outbuf。显然,在编码时,inbuf就是用于存储接收到的PCM数据,outbuf就是存编码后得到的数据。
int out_size = encoder.encode(in_size);
其返回值out_size,表示在outbuf里的有效数据长度。此时可以把outbuf里的aac数据通过网络发送或其他用途。
其中,用户需要知道encoder每次处理多长的数据,即一个frame的大小。对于单声道MONO来说,每次应该输入2048byte的数据。对于双声道STEREO来说,应该输入4096byte的数据。下面这一行可以根据声道数来计算输入的frame的大小:
int in_size = aac.Encoder.frameSize(1);
AAC解码:
(1) 创建一个Decoder对象作为成员变量
aac.Decoder decoder;
(2) 初始化
decoder = new aac.Decoder();
if( ! decoder.open())
{
Log.d("mylog", "failed to open decoder !\n");
decoder = null;
}
(3) 解码
Decoder对象也有inbuf和outbuf,把待解码的aac frame放到inbuf里
int pcm_size = decoder.decode(aac_size);
解得到数据在outbuf里,其有效长度为上述函数的返回值pcm_size,此时可以把outbuf里的PCM数据取出来播放或其他用途。
㈣ android如何使用fdk-aac编码库来把aac转成pcm
线性PCM就是WAV。
AAC-LC是AAC的一个规格,你下载到或者转换的这些高码率的AAC都是AAC-LC的。
扩展名是.m4a。
.aac 是aac的音频数据流,m4a是aac的一个封装方式。其内容本身是一样的。
我用s754,和e453功能是一样的。m4a和wav的我都放了,没问题,只是.aac的我还没试过。
但我相信lz没有.aac的。。因为这年头你下载到的或者转换出来的都是m4a的
㈤ 我想把一个6.7G的视频转换成1G以内的视频格式,请问什么格式最好,求教!
视频编码格式:hevc
编码器:x265 10bit版
音频编码格式:aac
编码器:qaac或neroaac或fdkaac
封装格式:mkv或mp4
㈥ 在ubuntu12.04LTS下成功编译安装带有h264和aac编码的ffmpeg的完整过程(命令行)
先下载最少yasm、ffmpeg、x264的源码,
具体步骤和这个差不多。
https://trac.ffmpeg.org/wiki/UbuntuCompilationGuide
h.264通常只用x264一种。
aac编码器有fdk,visualon,faac,aacplus,内置的等5种选择。
用fdk最好,其余任一也够。
先编译组件,通常是
./configure 具体包的设置选项
make install
编译好各个组件后,最后再设置和编译ffmpeg。
c编译器的选项CFLAGS最好一致。可以针对自己的cpu优化。比如加入
“-Ofast ”只为速度
-mtune core2 使用core2的优化。
㈦ 怎么编译windows 64位版本的libav
libav是ffmpeg的一个分支,我纯粹是出于喜欢avconv和avprobe这样清晰的命名才对它有好感。
因为官方网站有一个编译指南,以下只是本人在实际编译过程中的一些问题点的记录。
编译环境准备
因为libav使用configure脚本来编译,所以必须要安装mingw的msys,这样可以有一个bash来运行configure脚本,以及保证一个可用的gnu make来执行编译。现在安装Mingw可以使用mingw-get,类似于一个包管理器,我们只需要msys的包和coreutils的ext包就可以了。
其次我使用VS2013 Express版本的msvc来编译。在之前版本的msvc,只需要安装Windows SDK那个光盘镜像就可以有一个命令行的编译环境了,但是VS2013之后,必须安装VS2013的光盘镜像才可以(Express版本足矣)。
另外libav中有汇编代码,语法是yasm,所以得下载一份windows版本的yasm。
依赖的第三方库准备
我只准备了zlib和libfdk_aac两个库,前者其实我不知道libav哪里用了,只是看到指南中有提及,就下载了,libfdk_aac据说是目前开源界最好的aac编解码库,只是因为用了一个custom的license,所以用它编译出来的二进制文件是禁止发布的,所以想用支持这个库的libav只能自己编译用。
按照指南中的说明来修改编译zlib即可,非常straight forward,只是要编译一个x64的zlib.lib有需要注意的地方;cl.exe编译object file的时候是没有选项来指定要生成32位还是64位的,相反的,它用不同的cl.exe用来实现这一点,使用vs2013的两个命令行快捷方式开启编译环境命令行即可(也就是给vcvarsall.bat传递不同的参数来打开相应的编译环境命令行,例如我安装的32位的VS2013 Express,就可以用vcvarsall.bat x86_amd64在PATH中准备好一个本身是32位的但生成的目标文件是64bit的cl.exe)。
libfdk_aac的代码中没有为msvc的toolchain来准备任何配置,所以我采用的最笨的方法:在VC中新建一个static library类型的工程,然后把需要的文件全部添加进来(除了aac decoder的部分),并且配置各种细节,来生成最后的64位的fdk-aac.lib文件。
configure libav
然后把zlib的头文件和libfdk_aac的encoder的头文件放到3rd/headers,把刚才生成的lib放到3rd/libs。正如指南中说的,msvc的toolchain会使用INCLUDE和LIB两个环境变量来确定头文件和库文件的位置;在打开vcvarsall.bat之后,这两个变量已经带了系统库的设定;而我们需要在./configure和make执行的时候,都要在这两个变量中加上我们的3rd环境;因为用msys的bash来运行,只需要在这两个命令前面如此设置即可:
INCLUDE=3rd/headers/;$INCLUDE LIB=3rd/libs/;$LIB ./configure
还有需要删除mingw的link.exe,避免与msvc中的link.exe冲突,指南中也提到了。
另外附上我的configure参数,因为我的fdk-aac.lib中没有解码器,我专门声明了不使用它的解码器:
./configure --disable-debug \
--enable-gpl --enable-nonfree \
--enable-runtime-cpudetect \
--disable-avplay --disable-avserver \
--disable-encoder=aac \
--enable-libfdk-aac --disable-decoder=libfdk_aac \
--toolchain=msvc
libav本身的修改和make
libav在windows下,会把通过GetCommandLineW()来获取UTF-16LE版本的命令行参数,并转换成UTF-8之后才进行后续的所有操作(libav内部都是用UTF-8来统一对待字符串编码的);但是在往控制台打log的时候,直接用fputs接口向stderr打印UTF-8的multibyte字符串,在CP_ACP(ANSI codepage)为gbk的中文windows上,字符串中的非ascii字符(例如刚才命令行传入的中文文件名)就会打印为乱码(因为系统用GBK来解码UTF-8的字符串)。
解决方案是:
先用MultiByteToWideChar()把待打印的UTF-8 multibyte字符串转换回UTF-16LE的wchar_t字符串;
这时候如果用fwputs来打印转换后的字符串,会发现一遇到非ascii字符就会调用失败(打印停止),这是因为默认的locale中的LC_TYPE(这个locale category专门控制字符相关的操作的)是"C",用setlocale(LC_TYPE, "")设置为系统默认(中文系统为GBK),或者显式调用setlocale(LC_TYPE, ".936")设置为GBK,就能成功打印出UTF-16LE中的GBK能表示的字符;
但是这个locale+fwputs的方案只能显示出一种ANSI方案支持的字符,想显示出所有UTF-16LE支持的字符,应该直接使用windows的API调用,WriteConsoleW(GetStdHandle(STD_ERROR_HANDLE), wcMsg, wcMsgLen, &wcMsgLen, NULL)。
以下是我对libavutil/log.c的patch:
--- log.c 2014-08-04 10:02:34 +0800
+++ libav-64bit/libav-10.3/libavutil/log.c 2014-09-10 06:42:02 +0800
@@ -59,6 +59,10 @@
static void colored_fputs(int level, const char *str)
{
+#if HAVE_COMMANDLINETOARGVW && defined(_WIN32)
+ int wcBufLen = 0;
+ wchar_t* wcBuf = NULL;
+#endif
if (use_color < 0) {
#if HAVE_SETCONSOLETEXTATTRIBUTE
CONSOLE_SCREEN_BUFFER_INFO con_info;
@@ -83,7 +87,19 @@
if (use_color) {
set_color(level);
}
+#if HAVE_COMMANDLINETOARGVW && defined(_WIN32)
+ wcBufLen = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
+ if (wcBufLen == 0) {
+ fputs("Failed to convert multibyte log string to widechar.\n", stderr);
+ exit(1);
+ }
+ wcBuf = (wchar_t*)malloc(wcBufLen *2);
+ wcBufLen = MultiByteToWideChar(CP_UTF8, 0, str, -1, wcBuf, wcBufLen);
+ WriteConsoleW(GetStdHandle(STD_ERROR_HANDLE), wcBuf, wcBufLen, &wcBufLen, NULL);
+ free((void*)wcBuf);
+#else
fputs(str, stderr);
+#endif
if (use_color) {
reset_color();
}
使用avconv的简易教程
avprobe xxx.mkv
看清音轨是哪个,也就是一个数字音轨号;其实大部分时候一个容器中的所有音轨都是一种格式的,所以其实也不用看,下面用a指定所有的就好了
avconv -i xxx.mkv -c -c:1 libdfk_aac out.mkv
以上把1号轨按照aac重新编码,别的轨全部对拷
avconv -i xxx.mkv -c -c:a libdfk_aac out.mkv
以上把所有音轨按照aac重新编码,别的轨全部对拷
avconv -i xxx.mkv -i xxx.srt -c -c:a libdfk_aac out.mkv
以上演示另外附加一个srt,注意所有的-c参数都要放在所有-i文件之后
如何去掉输入文件中的某些轨呢(需要借鉴avprobe xxx.mkv的输出了):
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0 out.mkv
以上语句实现功能跟不加-map 0一样,map 0是说把第0号输入文件中的所有轨都输入到out.mkv
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0:v out.mkv
以上语句讲只输出视频轨
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0:v -map 0:1 -map 0:s out.mkv
如果输入文件中0为视频,1和2均为音频轨,3和4为字幕轨,以上语句可以只输出0 1 3轨,不输出2号音频轨
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0:0 -map 0:1 -map 0:3 -map 0:4 out.mkv
以上功能相同,只是完全用轨的数字序号来表示
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0 -map -0:2 out.mkv
以上功能相同,只是用“负”来表示从之前形成的map中去掉指定的轨
注意map选项用在输出之前,所有-i之后
某些文件(例如avi)在remux到mkv的时候会报错,给avconv加上-fflags +genpts一般能解决
㈧ ffmpeg 把avi转换flv怎么是0kb
ffmpeg版本太旧,用的7年前的版本。支持太少。换新版即可。
我自己编译的版本,为core2以上cpu优化
ffmpeg version N-57940-g1b3d3a9 Copyright (c) 2000-2013 the FFmpeg developers
built on Nov 6 2013 18:49:29 with gcc 4.7.3 (GCC)
configuration: --prefix=/mingw/i686-w64-mingw32 --enable-version3 --enable-gpl
--enable-nonfree --enable-avisynth --enable-libfaac --enable-libaacplus --enabl
e-libvo-aacenc --enable-libfdk-aac --enable-libmp3lame --enable-libx264 --enable
-librtmp --enable-libvpx --enable-libvorbis --enable-libopus --disable-runtime-c
pudetect --disable-doc --disable-manpages --disable-podpages --disable-txtpages
--enable-cross-compile --target-os=mingw32 --arch=x86 --enable-w32threads --extr
a-cflags='-Ofast -mtune=core2 -fomit-frame-pointer' --extra-libs='-lrtmp -lpolar
ssl -lwinmm -lws2_32 -lgdi32'
libavutil 52. 52.100 / 52. 52.100
libavcodec 55. 41.100 / 55. 41.100
libavformat 55. 21.100 / 55. 21.100
libavdevice 55. 5.100 / 55. 5.100
libavfilter 3. 90.102 / 3. 90.102
libswscale 2. 5.101 / 2. 5.101
libswresample 0. 17.104 / 0. 17.104
libpostproc 52. 3.100 / 52. 3.100
㈨ 请教FDK aac编码器的安装
视频编码格式:hevc编码器:x26510bit版音频编码格式:aac编码器:qaac或neroaac或fdkaac封装格式:mkv或mp4
㈩ 请问AAC和AC3那个好一点,我应该用那种音频编码
纠结中..........不太敢回答你,鼓起勇气!说!错了你别怪!
AAC是一种音频压缩方式,因为CD、DVD等盘片上的音频部分是数据流形式,使用播放器或播放软件播放会有很多限制(几年前如果没有光驱根本播放不了)。为了解决这个问题,有人就开发出了音频压缩方式,最初是MP3一类的,后来,因为MP3的音质属实太差, 又开发出了 AAC 压缩方式,音质要比MP3好多了。但是,虽然有众多大品牌支持,由于其仍然属于有损压缩方式,并不被十分看好。无损压缩方式目前APE、FLAC占主流位置,其音质不是AAC可比拟的。只是,文件容量要大一些,但由于大容量存储芯片的普及,现在这个已经不是问题了。
至于AC-3则是杜比实验室推出的一种家庭影院多声道数字音频系统。AC-3提供的环绕声系统由五个全频域声道加一个超低音声道组成,所以被称作5.1个声道。五个声道包括前置的"左声道"、"中置声道"、"右声道"、后置的"左环绕声道"和"右环绕声道"。这些声道的频率范围均为全频域响应3-20000Hz。第六个声道也就是超低音声道包含了一些额外的低音信息,使得一些场景如爆炸、撞击声等的效果更好。由于这个声道的频率响应为3-120Hz,所以称".1"声道。 当然,这种5.1音频系统需要从音源的现场录制开始就要采用,播放时也需要使用专用的解码器。如果在电脑上播放,也可以使用“DTS声卡”来做解码,可以减少一些成本。毕竟一只DTS声卡 只有一千多元钱。
提醒一下:(如果你已经知道,可以无视)我们在电子或电脑市场能够买到的所谓2.1、4.1、5.1电脑音箱大多都是垃圾产品。只有少数价格较高的2.1音质还能说的过去,而5.1如果没有美国杜比认证,则都是外形仿造而已,没有解码电路的,只靠电脑输出的两个声道乱放一气而已。
不知道你是不是有什么误解的地方,或者究竟想要干什么,只好把两种都解释一遍,你自己判断吧!
AAC只是一种压缩方式,不是一种编码。AC3格式则是在抓取ac-3音轨时为了保留AC-3编码形成的文件,当然你可以通过转换软件将普通音频文件转换成AC3文件,但是,这样不只是源文件受到很大损伤,ac-3的效果也只能算扯淡!毕竟不是向杜比实验室支付了使用费,并且在音频信号录制(拍摄过程中)时就采用了ac-3编码。