源码安装ffmpeg(源码安装nginx)
本文目录一览:
- 1、ios下 怎么在代码中调用ffmpeg的命令
- 2、window下ffmpeg怎么解决 在线等 对其不熟 只想用
- 3、如何用Android NDK编译FFmpeg
- 4、怎么利用ffmpeg实现android播放器
- 5、怎样使用ffmpeg 进行音频解码
ios下 怎么在代码中调用ffmpeg的命令
ffmpeg是一个多平台多媒体处理工具,处理视频和音频的功能非常强大。目前在网上搜到的iOS上使用FFMPEG的资料都比较陈旧,而FFMPEG更新迭代比较快; 且网上的讲解不够详细,对于初次接触FFMPEG的新手(例如我)来说确实不太好使用。为了防止忘记,这里对iOS下使用FFMPEG做一个总结。
1. FFMPEG层次结构的简单理解
要使用FFMPEG,首先需要理解FFMPEG的代码结构。根据志哥的提示,ffmpeg的代码是包括两部分的,一部分是library,一部分是tool。api都是在library里面,如果直接调api来操作视频的话,就需要写c或者c++了。另一部分是tool,使用的是命令行,则不需要自己去编码来实现视频操作的流程。实际上tool只不过把命令行转换为api的操作而已。
2. 预热-在mac os下使用ffmpeg
在mac os下使用ffmpeg比较简单,可以直接使用命令行来操作。首先安装ffmpeg,这里默认系统已经安装好brew,只需要在终端上输入:
brew install ffmpeg
等待安装结束即可。
安装结束后,尝试以下命令:
ffmpeg -i input.mp4 output.avi
如果能顺利转换,表明安装成功
3. 编译能在iOS下使用的FFMPEG library库
这一步是编译1所说的library,编译好之后可以调用FFMPEG的api。网上有一些方法,但都要自己手动编译,稍显复杂而且比较陈旧。按照app store的需求,编译出来的包还必须支持arm64。我在万能的github中找到一个能够"一键编译"的脚本,地址如下:
而且写这个脚本的歪果仁挺好人,更新很及时,已经更新到了最新的2.5.3版本。下载下来,只有一个build-ffmpeg.sh脚本文件。在终端中转至脚本的目录,执行命令:
./build-ffmpeg.sh
脚本则会自动从github中把ffmpeg源码下到本地并开始编译。
编译结束后,文件目录如下:
其中,ffmpeg-2.5.3是源码,FFmpeg-iOS是编译出来的库,里面有我们需要的.a静态库,一共有7个。
执行命令:
lipo -info libavcodec.a
查看.a包支持的架构,这几个包都支持了armv7 armv7s i386 x86_64 arm64这几个架构,这个脚本果真是业界良心啊~~~
4.在xcode中引入FFMPEG library库
新建工程,把上面编译好的FFmpeg-iOS拖到xcode工程中,添加一个头文件引用
#include "avformat.h"
添加一个api语句:
av_register_all();
添加一个空的类,把执行文件.m后缀改为.mm,开启混编模式。
添加相应的framework,包括avfoundation和coremedia。
运行工程,如果没有报错,则表明编译成功。
5.在xcode项目中使用命令行
执行到第4步,已经可以使用library库了。但是如果要对视频进行操作,还是需要手动写很多代码去调用api,工作量较大,自然不如直接写命令行方便。为了命令行能够在xcode工程中使用,还需要做以下工作:
(1)添加源码中的tools,具体文件包括:
(2)添加Header Search Paths
在target--build setting中搜索Header Search Paths,并在Header Search Paths下面添加源码ffmpeg-2.5.3和scratch的路径。
(3)修改ffmpeg.h和ffmpeg.c源码
如果此时run这个工程,则会报错,原因是工程里面有2个main函数,此时处理方法为:
在ffmpeg.h中添加一个函数声明:
int ffmpeg_main(int argc, char **argv);
在ffmpeg.c中找到main函数,把main函数改为ffmpeg_main。
(4)调用命令行范例
添加头文件:#import "ffmpeg.h"
调用命令行
int numberOfArgs = 16;
char** arguments = calloc(numberOfArgs, sizeof(char*));
arguments[0] = "ffmpeg";
arguments[1] = "-i";
arguments[2] = inputPath;
arguments[3] = "-ss";
arguments[4] = "0";
arguments[5] = "-t";
arguments[6] = durationChar;
arguments[7] = "-vcodec";
arguments[8] = "copy";
arguments[9] = "-acodec";
arguments[10] = "aac";
arguments[11] = "-strict";
arguments[12] = "-2";
arguments[13] = "-b:a";
arguments[14] = "32k";
arguments[15] = outputPath;
int result = ffmpeg_main(numberOfArgs, arguments);
其中inputpath和outputpath是文件路径。经测试,这两个路径不支持asset-library://协议和file:// 协议,所以如果是要用相册的文件,我目前的解决办法是把它拷贝到沙盒里面。
6. 改关闭进程为关闭线程
如果顺利进行到了第5步,在app中是能够用命令行处理视频了,但会出现一个问题,app会退出。经肖大神提醒,发现了命令行执行完毕之后会退出进程。而iOS下只能启动一个进程,因此必须改关闭进程为关闭线程,或者直接把关闭进程的方法给注掉。
在ffmpeg.c中可以看到,执行退出进程的方法是exit_program,定位到了cmdutils.c中执行了c语言的exit方法。这里我将它改为了pthread_exit(需要添加#include 头文件)。在xcode项目中使用时,则可以用NSThread来新开一个线程,执行完毕之后,把线程关闭了即可。再使用NSThreadWillExitNotification通知,即可监听线程退出的情况。
7. 修复ffmpeg.c里面的一个bug
在实际项目中,可能需要多次调用命令行,但在多次调用命令行的过程中,发现ffmpeg.c的代码中会访问空属性导致程序崩溃。逐步debug后发现,很多指针已经置空了,但它们的计数却没有置零,不知道是不是ffmpeg.c的一个bug。修复方法如下:在ffmpeg_cleanup方法下,将各个计数器置零,包括:
nb_filtergraphs
nb_output_files
nb_output_streams
nb_input_files
nb_input_streams
置零之后,重复使用ffmpeg_main方法一切正常。
window下ffmpeg怎么解决 在线等 对其不熟 只想用
1、准备工作:
在干活之前,先把下面五个软件下载下来。
1)MinGW-MSYS Bundle
2) SDL
3)yasm
4)FFmpeg
5)pthreadgc2.dll
2、安装MinGW-MSYS Bundle软件
网上99%的方法都是先安装mingw,再通过网络下载的方法来安装mingw和msys软件。安装好之后,还需要通过烦琐的配置,来搭建编译环境。sourceforge开源平台给大家带来了福音,MinGW-MSYS Bundle软件同时包含了MinGW和MSYS,不需要连接网络进行安装,并且包含了最新的核心组件和库文件。
按照软件默认的安装向导,一路Next,把软件安装好。我是把软件装在了C盘。
3、安装SDL
到上文列出的SDL官方网站地址,下载SDL源码包。咱下载SDL最新的源码包SDL-1.2.15.tar.gz。
到ffmpeg网站,下在ffmpeg源码包,咱下的是最新的版本ffmpeg-1.2.1.tar.gz
把ffmpeg解压缩到C:\msys\1.0\ffmpeg-1.2.1\ffmpeg-1.2.1\ 目录,再把SDL解压缩到C:\msys\1.0\ffmpeg-1.2.1\ffmpeg-1.2.1\SDL-1.2.15目录。
进入SDL目录,分别执行
./configure --prefix=/usr
make
make install
完成SDL的安装。
SDL编译完成之后,生成的bin文件、include文件、lib文件存放在C:\msys\1.0\local\SDL目录下。
通过下面命令导入SDL环境变量.
export PATH="$PATH:/usr/local/SDL/bin:/usr/local/SDL/include/SDL:/usr/local/lib"
否则,在执行ffmpeg configure时,SDL support项显示为no.(注:mingw默认根目录对应与windows下的C:\msys\1.0\目录,可以通过echo $PATH查看当前的系统路径)
4、安装yasm
到yasm官方网站,下载最新的1.2.0版本的yasm源码包Source .tar.gz。
解压到C:\msys\1.0\ffmpeg-1.2.1\yasm-1.2.0目录。
进入yasm目录,分别执行:
./configure --prefix=/usr/local/yasm
make
make install
并通过下面命令导入yasm环境变量。
export PATH="$PATH:/usr/local/yasm/bin"
5、安装ffmpeg
进入ffmpeg代码目录C:\msys\1.0\ffmpeg-1.2.1\ffmpeg-1.2.1\, 分别执行下面命令:
./configure --enable-shared --disable-static --enable-memalign-hack
make
make install
编译完成后,在C:\MinGW\msys\1.0的bin、include和lib文件夹下可以看到编译结果。
make install 之后,ffplay.exe 、ffmpeg.exe等可执行程序安装到C:\MinGW\msys\1.0\bin路径下。
如何用Android NDK编译FFmpeg
一、安装cygwin、配置ndk和下载ffmpeg源码
这步就不说了,网上很多教程,再次声明本教程只针对ndk R4这个版本。需要说明的是,本人在cygwin安装路径下的.bash_profile文件中指定的NDK路径如下所示。因为本人装了好几个NDK,因此后面的R4只是个标示。
NDK_R4=/cygdrive/d/android-ndk-r4
export NDK_R4
二、编译前准备和编译
1、因为R4这个NDK比较旧,交叉编译的时候需要在一个Android环境中,那简单,创建一个Android空项目,把整个项目拷出来,在项目下建立一个文件夹jni,把ffmpeg0.6.6的源码拷进去。左图,HelloJni就是我新建的一个项目,Android.mk这时候你还没有,先不用管。右图ffmpeg-0.6.6文件夹的内容要跟我一样,直接就是代码。我这里的ffmpeg_cywin这个文件夹是随便建的,放哪里无所谓的。
2、在ffmpeg-0.6.6下建立一个文件config.sh,内容如下所示。需要注意的是,unix下的换行符和windows下是不一样,如果直接拷贝到windows下的记事本,后面执行这个config.sh的时候会出问题,这里我用的是notepad++编辑的,在编辑-档案格式转换-转换为UNIX格式。(注意,后面的所有的Android.mk的编辑都有此要求)。
简单说一下这个config.sh,PREBUILT和PLATFORM根据你安装ndk的位置而不同,config.sh其实是一个脚本,执行这个脚本的时候又调用了另外一个脚本configure,configure主要是根据编译选项(下面enable disable那些),生成相应的编译配置,就是说你想要编译ffmpeg什么模块就自己定制编译选项的内容。基本上这个文件只要修改一下PREBUILT和PLATFORM就行,其他都不用改。
#!/bin/bash
export PREBUILT=D://android-ndk-r4/build/prebuilt/windows/arm-eabi-4.4.0
export PLATFORM=D://android-ndk-r4/build/platforms/android-8/arch-arm
./configure --target-os=linux \
--arch=arm \
--enable-version3 \
--enable-gpl \
--enable-nonfree \
--disable-stripping \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffserver \
--disable-ffprobe \
--disable-encoders \
--disable-muxers \
--disable-devices \
--disable-protocols \
--enable-protocol=file \
--enable-avfilter \
--disable-network \
--disable-mpegaudio-hp \
--disable-avdevice \
--enable-cross-compile \
--cc=$PREBUILT/bin/arm-eabi-gcc \
--cross-prefix=$PREBUILT/bin/arm-eabi- \
--nm=$PREBUILT/bin/arm-eabi-nm \
--extra-cflags="-fPIC -DANDROID" \
--disable-asm \
--enable-neon \
--enable-armv5te \
--extra-ldflags="-Wl,-T,$PREBUILT/arm-eabi/lib/ldscripts/armelf.x -Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib $PREBUILT/lib/gcc/arm-eabi/4.4.0/crtbegin.o $PREBUILT/lib/gcc/arm-eabi/4.4.0/crtend.o -lc -lm -ldl"
3、修改configure文件,找到下图的内容,修改成我这样,这个是用来存放执行脚本过程的临时文件的,我这里用的是D://NDK,你可以设置其他地方,但是要先创建好这个文件夹,放哪里无所谓的。
4、然后在cywin中进入ffmpeg0.6.6文件夹,执行chmod -x config.sh,然后执行./config,此过程需要一定的时间。如果这一步出现问题,很有可能是你config.sh中的PREBUILT和PLATFORM的路径设置不对,或者是你拷贝内容到config.sh的时候没有在UNIX格式下。执行完如下图所示。
5、在ffmpeg-0.6.6下会生成一个config.h文件,编辑它,找到#define restrict restrict这一行,把它改成#define restrict
6、在libavutil/libm.h下,把所有static的方法注释掉或者直接删掉。
7、修改libavcodec,libavfilter,libavformat,libavutil,libpostproc和libswscale目录的MakeFile文件,每个文件中,删除语句
include $( SUBDIR ) ../config.mak 和 include $ (SUBDIR) .. / subdir.mak。
libavcodec下的makefile中搜索inverse.o,把它所在的那一行删掉,要不编译的时候会冲突。
8、在ffmpeg-0.6.6文件夹下,创建av.mk文件(UNIX格式),内容如下:
#LOCAL_PATH is one of libavutil, libavcodec, libavformat, or libswscale
#include $(LOCAL_PATH)/../config-$(TARGET_ARCH).mak
include $(LOCAL_PATH)/../config.mak
OBJS :=
OBJS-yes :=
MMX-OBJS-yes :=
include $(LOCAL_PATH)/Makefile
# collect objects
OBJS-$(HAVE_MMX) += $(MMX-OBJS-yes)
OBJS += $(OBJS-yes)
FFNAME := lib$(NAME)
FFLIBS := $(foreach,NAME,$(FFLIBS),lib$(NAME))
FFCFLAGS = -DHAVE_AV_CONFIG_H -Wno-sign-compare -Wno-switch -Wno-pointer-sign
FFCFLAGS += -DTARGET_CONFIG=\"config-$(TARGET_ARCH).h\"
ALL_S_FILES := $(wildcard $(LOCAL_PATH)/$(TARGET_ARCH)/*.S)
ALL_S_FILES := $(addprefix $(TARGET_ARCH)/, $(notdir $(ALL_S_FILES)))
ifneq ($(ALL_S_FILES),)
ALL_S_OBJS := $(patsubst %.S,%.o,$(ALL_S_FILES))
C_OBJS := $(filter-out $(ALL_S_OBJS),$(OBJS))
S_OBJS := $(filter $(ALL_S_OBJS),$(OBJS))
else
C_OBJS := $(OBJS)
S_OBJS :=
endif
C_FILES := $(patsubst %.o,%.c,$(C_OBJS))
S_FILES := $(patsubst %.o,%.S,$(S_OBJS))
FFFILES := $(sort $(S_FILES)) $(sort $(C_FILES))
9、在jni文件夹下,创建Android.mk(UNIX格式),内容如下:
include $(all-subdir-makefiles)
10、在ffmpeg-0.6.6文件夹下,创建Android.mk,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_STATIC_LIBRARIES := libavformat libavcodec libavutil libpostproc libswscale
LOCAL_MODULE := ffmpeg
include $(BUILD_SHARED_LIBRARY)
include $(call all-makefiles-under,$(LOCAL_PATH))
11、在ffmpeg-0.6.6\libavformat下,创建Android.mk,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_CFLAGS += -include "string.h" -Dipv6mr_interface=ipv6mr_ifindex
LOCAL_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)
12、在ffmpeg-0.6.6\libavcodec下,创建Android.mk,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)
13、在ffmpeg-0.6.6\libavfilter、libavutil、libpostproc和libswscale下,创建Android.mk,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)
14、然后在jni目录下,运行$NDK_R4/ndk-build -B,这里的命令需要根据你自己的情况修改,然后就开始编译了。过程需要10来分钟,成功之后,会在libs下生产libffmpeg.so。如果编译出来的libffmpeg.so只有1.5k,得如下修改一下NDK,再重新编译。
把下面红色部分加到NDK的build/core/build-binary.mk里:
LOCAL_STATIC_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_STATIC_LIBRARIES))
LOCAL_STATIC_WHOLE_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_STATIC_WHOLE_LIBRARIES))
...
static_libraries := $(call map,static-library-path,$(LOCAL_STATIC_LIBRARIES))
static_whole_libraries := $(call map,static-library-path,$(LOCAL_STATIC_WHOLE_LIBRARIES))
...
$(call module-add-static-depends,$(LOCAL_MODULE),$(LOCAL_STATIC_LIBRARIES))
$(call module-add-static-depends,$(LOCAL_MODULE),$(LOCAL_STATIC_WHOLE_LIBRARIES))
...
$(LOCAL_BUILT_MODULE): $(static_libraries) $(static_whole_libraries) $(shared_libraries)
...
$(LOCAL_BUILT_MODULE): PRIVATE_STATIC_LIBRARIES := $(static_libraries)
$(LOCAL_BUILT_MODULE): PRIVATE_WHOLE_STATIC_LIBRARIES := $(static_whole_libraries)
接着再将最外层ffmpeg/Android.mk里面的LOCAL_STATIC_LIBRARIES改成LOCAL_STATIC_WHOLE_LIBRARIES
怎么利用ffmpeg实现android播放器
下面把具体编译步骤描述如下,假定NDK安装在~/android-ndk-r7:
1. 首先从FFmpeg官网下载最新的release版本源码ffmpeg-0.11.tar.gz解压缩到Android源码树的ffmpeg/下。
2 准备一个编译脚本build_android.sh并放在ffmpeg/下面,这个脚本也是Rockplayer提供的,需做一些修改,其内容附在后面。我目前用的也会附在后面。
3 在ffmpeg目录下运行./build_android.sh开始编译FFmpeg,编译好的libffmpeg.so会放在文件夹android里面,一共有3个版本分别对应3种ARM体系结构,包括armv7-a、armv7-a-vfp、armv6_vfp,根据所运行的硬件平台选取其中一个版本。为了编译使用FFmpeg的程序时可以方便地找到libffmpeg.so,可将它复制到$OUT/system/lib/和$OUT/obj/lib/,当然这一步也可以加在build_android.sh中做。
4. 接下来就是编译可执行文件ffmpeg了,这个工具可以在命令行下完成FFmpeg提供的几乎所有功能包括编码、解码、转码等,也是用来调试和验证很有用的工具。其实上述编译完后在$ANDROID_BUILD_TOP/external/ffmpeg/下也会生成ffmpeg,但是在设备上无法运行。为了编出能在设备上运行的ffmpeg,可以写一个简单的Android.mk,
怎样使用ffmpeg 进行音频解码
安装完成ffmpeg后源码安装ffmpeg,就可以使用ffmpeg进行音频文件格式转换。比如 ./ffmpeg -i /media/1.mp3 /media/1.wav, 通过该命令行可以将/media文件夹下1.mp3文件转换成WAV格式的。
但是反过来 ./ffmpeg -i /media/1.WAV /media/1.MP3 却不能转换成Mp3格式源码安装ffmpeg,提示如下错误(找不到编码器):
Stream mapping:
Stream #0:0 - #0:0 (wav - ?)
Encoder (codec none) not found for output stream #0:0
如果强行指定编码器 ./ffmpeg -i /media/1.wav -acodec mp3 /media/1.mp3, 仍提示找不到编码器错误:
Unknown encoder 'mp3'
这是因为,ffmpeg虽然是个开源软件,但因为具体格式的版权原因,它并没有包含所有的编解码格式,或者有个格式只有对应的解码器,但没有编码器,比如 Mp3就只有解码器,能播放Mp3文件,但却没有Mp3的编码器,无法将其它格式转换成Mp3。可以通过命令行 ./ffmpeg -codecs 查询编解码配置,第一个D表示Decoder,该格式能够解码;E表示Encoder,该格式可以编码。从中可以看出Mp3不能编码,Mp2倒是即可解码 也可编码。如何解决这个问题呢?
D A D mp1 MP1 (MPEG audio layer 1)
D A D mp1float MP1 (MPEG audio layer 1)
DEA D mp2 MP2 (MPEG audio layer 2)
D A D mp2float MP2 (MPEG audio layer 2)
D A D mp3 MP3 (MPEG audio layer 3)
D A D mp3adu ADU (Application Data Unit) MP3 (MPEG audio layer 3)
D A D mp3adufloat ADU (Application Data Unit) MP3 (MPEG audio layer 3)
我的第一个方法是自己写代码来完成。源码文件中,Allcodecs.c中对各个格式进行注册,先修改Mp3的注册行,改为同时注册解码器和编码器:
REGISTER_ENCDEC (MP2, mp2);
REGISTER_DECODER (MP2FLOAT, mp2float);
REGISTER_DECODER (MP3, mp3) // 此行修改为 REGISTER_ENCDEC (MP3, mp3)
然后新增Mp3编码器的实现Struct,里面Init函数、encode函数、close函数使用Mp2的函数,因为我也不知道如何去实现Mp3的函数,或者说到代码实现级我也不知道Mp3和Mp2的区别在哪。
AVCodec ff_mp3_encoder = {
.name = "mp3",
.type = AVMEDIA_TYPE_AUDIO,
.id = CODEC_ID_MP3,
.priv_data_size = sizeof(MpegAudioContext),
.init = MPA_encode_init,
.encode = MPA_encode_frame,
.close = MPA_encode_close,
.sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE},
.supported_samplerates= (const int[]){44100, 48000, 32000, 22050, 24000, 16000, 0},
.long_name = NULL_IF_CONFIG_SMALL("MP3 (MPEG audio layer 3)"),
.defaults = mp3_defaults,
};
重新编译上线。 用命令行./ffmpeg -i /media/1.WAV /media/1.MP3 试源码安装ffmpeg了一下,能成功生成1.mp3文件,文件也能播放。似乎没有问题了,单用 file /media/1.mp3 查看了一下,发现文件不是Mp3格式的,而是Mp2格式的:
/media/1.mp3: MPEG ADTS, layer II, v1, 128 kbps, 44.1 kHz, Stereo
很遗憾,自行修改代码的方式行不通,因为不是每个编解码格式协议的专家,自行修改代码失败的风险很大,不仅是Mp3,还有一些其他格式比如AMR OGG H.263是没有编码器的。所以,第二个方案,使用成熟的第三方编码器和ffmpeg结合。
Mp3比较好的开源第三方库是libmp3lame(简称Lame)。我下了一个最新版本(3.99.4)的Lame源码,编译它:
首先配置: ./configure --prefix=/shared --enable-shared --enable-static
然后编译: make
make install
生成文件: 动态链接库 /shared/lib/libmp3lame.so 和 静态链接库 /shared/lib/libmp3lame.a。这里只需要使用动态链接库,将.so文件拷贝到/lib中,这个文件夹是动态链接库的默认搜索路径, 让ffmpeg运行时可以找到。
然后对ffmpeg配置libmp3lame: ./configure --enable-libmp3lame
重新编译ffmpeg,运行转化命令,看看效果如何。
首先执行 ./ffmpeg -codecs 查看可用编解码的变化,可以看到多出了libmp3lame编码器,带E的:
D V D lagarith Lagarith lossless
EA libmp3lame libmp3lame MP3 (MPEG audio layer 3)
EV ljpeg Lossless JPEG
D V D loco LOCO
然后执行 ./ffmpeg -i /media/1.WAV /media/1.MP3, 生成1.mp3,用File命令查看,确实是Mp3文件。
/media/1.mp3: Audio file with ID3 version 2.4.0, contains: MPEG ADTS, layer III, v1, 128 kbps, 44.1 kHz, Stereo
大功告成,问题解决。
也可在命令行中指定编解码生成Mp3文件:./ffmpeg -i /media/1.WAV -acodec libmp3lame /media/1.MP3.