當前位置:首頁 » 編程軟體 » libfdkaac編譯

libfdkaac編譯

發布時間: 2022-10-03 14:18:23

① 請教一個使用fdkaac 編碼的問題

線性PCM就是WAV。
AAC-LC是AAC的一個規格,你下載到或者轉換的這些高碼率的AAC都是AAC-LC的。
擴展名是.m4a。

.aac 是aac的音頻數據流,m4a是aac的一個封裝方式。其內容本身是一樣的。
我用s754,和e453功能是一樣的。m4a和wav的我都放了,沒問題,只是.aac的我還沒試過。
但我相信lz沒有.aac的。。因為這年頭你下載到的或者轉換出來的都是m4a的

② 怎樣用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數據取出來播放或其他用途。

③ 怎麼編譯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 命令大全

前言
FFMPEG是特別強大的專門用於處理音視頻的開源庫。你既可以使用它的API對音視頻進行處理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,來編輯你的音視頻文件。
本文將簡要介紹一下 FFMPEG 庫的基本目錄結構及其功能,然後詳細介紹一下我們在日常工作中,如何使用 ffmpeg 提供的工具來處理音視頻文件。

在講解 FFMPEG 命令之前,我們先要介紹一些音視頻格式的基要概念。

我們按使用目的可以將 FFMPEG 命令分成以下幾類:

除了 FFMPEG 的基本信息查詢命令外,其它命令都按下圖所示的流程處理音視頻

先是解復用獲取到編碼的數據包,然後將編碼的數據包傳送給解碼器(除非為數據流選擇了流拷貝,請參閱進一步描述)。 解碼器產生未壓縮的幀(原始視頻/ PCM音頻/ ...),可以通過濾波進一步處理(見下一節)。 在過濾之後,幀被傳遞到編碼器,編碼器並輸出編碼的數據包。 最後,這些傳遞給復用器,將編碼的數據包寫入輸出文件。

默認情況下,ffmpeg只包含輸入文件中每種類型(視頻,音頻,字幕)的一個流,並將其添加到每個輸出文件中。 它根據以下標准挑選每一個的「最佳」:對於視頻,它是具有最高解析度的流,對於音頻,它是具有最多channel的流,對於字幕,是第一個字幕流。 在相同類型的幾個流相等的情況下,選擇具有最低索引的流。

您可以通過使用-vn / -an / -sn / -dn選項來禁用某些默認設置。 要進行全面的手動控制,請使用-map選項,該選項禁用剛描述的默認設置。

FFMPEG 可以使用下面的參數進行基本信息查詢。例如,想查詢一下現在使用的 FFMPEG 都支持哪些 filter,就可以用 ffmpeg -filters 來查詢。詳細參數說明如下:

查詢編譯器libfdk_aac的信息

FFMPEG 處理音視頻時使用的命令格式與參數

ffmpeg 通過 -i 選項讀取輸任意數量的輸入「文件」(可以是常規文件,管道,網路流,抓取設備等,並寫入任意數量的輸出「文件」。

原則上,每個輸入/輸出「文件」都可以包含任意數量的不同類型的視頻流(視頻/音頻/字幕/附件/數據)。 流的數量和/或類型是由容器格式來限制。 選擇從哪個輸入進入到哪個輸出將自動完成或使用 -map 選項。

要引用選項中的輸入文件,您必須使用它們的索引(從0開始)。 例如。 第一個輸入文件是0,第二個輸入文件是1,等等。類似地,文件內的流被它們的索引引用。 例如。 2:3是指第三個輸入文件中的第四個流

上面就是 FFMPEG 處理音視頻的常用命令,下面是一些常用參數

首先通過下面的命令查看一下 mac 上都有哪些設備。

注意,桌面的輸入對幀率沒有要求,所以不用限制桌面的幀率。其實限制了也沒用。

由於沒有解碼或編碼,速度非常快,沒有質量損失。 但是,由於許多因素,在某些情況下可能無法正常工作。 應用過濾器顯然也是不可能的,因為過濾器處理未壓縮的數據

上面的命令表式的是音頻、視頻都直接 ,只是將 mp4 的封裝格式轉成了flv。

在編碼之前,ffmpeg可以使用libavfilter庫中的過濾器處理原始音頻和視頻幀。 幾個鏈式過濾器形成一個過濾器圖形。 ffmpeg區分兩種類型的過濾器圖形:簡單和復雜。

請注意,某些濾鏡會更改幀屬性,但不會改變幀內容。 例如。 上例中的fps過濾器會改變幀數,但不會觸及幀內容。 另一個例子是setpts過濾器。

復雜的過濾器圖使用-filter_complex選項進行配置。 請注意,此選項是全局性的,因為復雜的過濾器圖形本質上不能與單個流或文件明確關聯。

-lavfi選項等同於-filter_complex。

一個復雜的過濾器圖的一個簡單的例子是覆蓋過濾器,它有兩個視頻輸入和一個視頻輸出,包含一個視頻疊加在另一個上面。 它的音頻對應是amix濾波器

添加文字水印

添加本地時間水印

https://www.jianshu.com/p/e4ad7e1e7ed5

先通過 ffplay 找到要刪除 LOGO 的位置

使用 delogo 濾鏡刪除 LOGO

crop 格式:crop=out_w:out_h:x:y

https://blog.csdn.net/matrix_laboratory/article/details/53158307

首先創建一個 inputs.txt 文件,文件內容如下:

然後執行下面的命令:

播放yuv數據,需要指定解析度

⑤ 請教FDK aac編碼器的安裝

視頻編碼格式:hevc編碼器:x26510bit版音頻編碼格式:aac編碼器:qaac或neroaac或fdkaac封裝格式:mkv或mp4

⑥ 如何使 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編碼了。

⑦ faac 和 faad 能不能在windows 下編譯如何編譯

ffmpeg是音視頻的分離,轉換,編碼解碼及流媒體的完全解決方案,其中最重要的就是libavcodec庫。它被mplayer或者xine使用作為解碼器。還有,國內比較流行的播放器影音風暴或MyMPC的後端ffdshow也是使用ffmpeg的解碼庫的。

ffmpeg軟體包經編譯過後將生成三個可執行文件,ffmpeg,ffserver,ffplay。其中ffmpeg用於對媒體文件進行處理,ffserver是一個http的流媒體伺服器,ffplay是一個基於SDL的簡單播放器。

ffmpeg中有五個庫文件,libavcodec,libavformat,libavutil,libswscale,libpostproc,其中庫libavcodec,libavformat用於對媒體文件進行處理,如格式的轉換;libavutil是一個通用的小型函數庫,該庫中實現了CRC校驗碼的產生,128位整數數學,最大公約數,整數開方,整數取對數,內存分配,大端小端格式的轉換等功能;libswscale,libpostproc暫時不知道何用。

⑧ 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

linux下編譯ffmpeg時關於configure的問題.

你准備工作沒做好吧!!

  1. 先編譯安裝Yasm。

  2. 然後編譯安裝H.264 (也就是x264)。

  3. 再編譯安裝AAC audio encoder (fdk-aac)。

  4. 編譯安裝libmp3lame (MP3 audio encoder)。

  5. 編譯安裝libopus (Opus audio decoder and encoder)。

  6. 編譯安裝libvpx (VP8/VP9 video encoder and decoder)。

  7. 做後編譯安裝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

⑩ 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的

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:336
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:378
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:612
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:32
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:107
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:945
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:742
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:803
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:511
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:372