https://www.imooc.com/article/247113
(音频专家李超老师的手记,老师慕课网视频:《FFmpeg音视频核心技术精讲与实战》)
2.1 安装yasm Yasm是什么
Ubuntu包安装
sudo apt-get install yasm源码安装:
wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar zxvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure
make && make install
2.2 编译安装fdk-aac AAC是什么
wget https://jaist.dl.sourceforge.net/project/opencore-amr/fdk-aac/fdk-aac-0.1.6.tar.gz tar xvf fdk-aac-0.1.6.tar.gz cd fdk-aac-0.1.6 ./configure make && sudo make install
2.3 安装 lame lame是什么?
Ubuntu包安装
sudo apt-get install yasm源码安装:
wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
tar -xzf lame-3.99.5.tar.gz
cd lame-3.99.5
./configure
make && sudo make install
2.4 安装 nasm nasm是什么
Ubuntu包安装
sudo apt-get install nasm源码安装:
wget https://www.nasm.us/pub/nasm/releasebuilds/2.13.03/nasm-2.13.03.tar.gz
tar xvf nasm-2.13.03.tar.gz
cd nasm-2.13.03
./configure
make && sudo make install
2.4 安装 x264 什么是X264
wget http://mirror.yandex.ru/mirrors/ftp.videolan.org/x264/snapshots/last_x264.tar.bz2
bunzip2 last_x264.tar.bz2
tar -vxf last_x264.tar
cd last_x264
./configure --enable-static --enable-shared --disable-asm --disable-avs
make && sudo make install
Ubuntu包安装
apt install ffmpeg 【可能版本较低,安装之前可以先apt-get updtae】
源码安装:
FFmpeg官网网站下载地址
1:git地址 git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
2:压缩包地址 https://ffmpeg.org/releases/ffmpeg-4.1.3.tar.bz2
cd -> 拉取&下载解压后的代码 目录下
执行:
./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-small --arch=x86_64 --enable-nonfree -- enable-libfdk-aac --enable-libx264 --enable-filter=delogo --enable-debug --disable-optimizations -- enable-shared
make && sudo make install
安装ffmpeg后续操作
上面我们编译完了FFMPEG之后可以去运行以下bin目录下生成的可执行文件
root@poc-virtual-machine:/usr/local/ffmpeg/bin# ./ffmpeg -help
./ffmpeg: error while loading shared libraries: libavdevice.so.58: cannot open shared object file: No such file or directory发现系统提示找不到动态库,可以用
root@poc-virtual-machine:/usr/local/ffmpeg/bin# ldd ffmpeg
root@poc-virtual-machine:/usr/local/ffmpeg/bin# ldd ffmpeg linux-vdso.so.1 (0x00007ffebe789000) libavdevice.so.58 => not found libavfilter.so.7 => not found libavformat.so.58 => not found libavcodec.so.58 => not found libpostproc.so.55 => not found libswresample.so.3 => not found libswscale.so.5 => not found libavutil.so.56 => not found libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fe61c757000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fe61c538000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe61c147000) /lib64/ld-linux-x86-64.so.2 (0x00007fe61cd2a000)
不想编译FFMPEG之后还要动自己系统的环境,这时有一个简单的方法可以解决这个问题。就是在当前终端export一个环 境变量:
/usr/local/ffmpeg/bin# export LD_LIBRARY_PATH=../lib/
再次执行 ldd ffmpeg
root@poc-virtual-machine:/usr/local/ffmpeg/bin# ldd ffmpeg linux-vdso.so.1 (0x00007ffcba331000) libavdevice.so.58 => ../lib/libavdevice.so.58 (0x00007fd9ad168000) libavfilter.so.7 => ../lib/libavfilter.so.7 (0x00007fd9acd0c000) libavformat.so.58 => ../lib/libavformat.so.58 (0x00007fd9ac937000) libavcodec.so.58 => ../lib/libavcodec.so.58 (0x00007fd9ab65d000) libpostproc.so.55 => ../lib/libpostproc.so.55 (0x00007fd9ab44a000) libswresample.so.3 => ../lib/libswresample.so.3 (0x00007fd9ab230000) libswscale.so.5 => ../lib/libswscale.so.5 (0x00007fd9aafba000) libavutil.so.56 => ../lib/libavutil.so.56 (0x00007fd9aad6b000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd9aa9cd000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd9aa7ae000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd9aa3bd000) libfdk-aac.so.1 => /usr/local/lib/libfdk-aac.so.1 (0x00007fd9aa0ff000) libx264.so.157 => /usr/local/lib/libx264.so.157 (0x00007fd9a9c48000) /lib64/ld-linux-x86-64.so.2 (0x00007fd9ad5aa000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fd9a9a44000)
如果仍有
XX.so.55 => not found
则 find / -name xx.so 找到 so库后 cp 拷入 xx//ffmpeg/lib 下即可正常 【若找不到,则请安装对应的库】
root@poc-virtual-machine:/usr/local/ffmpeg/bin# ./ffmpeg -help 【查看命令使用】
root@poc-virtual-machine:/usr/local/ffmpeg/bin# ./ffmpeg -version 【查看当前FFmpeg版本】 并列出 configuration
ffmpeg version 4.1.3 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 7 (Ubuntu 7.4.0-1ubuntu1~18.04)
configuration: --prefix=/usr/local/ffmpeg --enable-gpl --enable-small --arch=x86_64 --enable-nonfree --enable-libfdk-aac --enable-libx264 --enable-filter=delogo --enable-debug --disable-optimizations --enable-shared
libavutil 56. 22.100 / 56. 22.100...省略.....
通过av_log_set_level()设置当前Log的级别
通过 v_log()来输入日志
例子:
#include
#include
int main()
{
av_log_set_level(AV_LOG_DEBUG);
printf("Hello, World! \n");
av_log(NULL, AV_LOG_DEBUG, "Hello World FFmpeg!!\n");
return 0;
}
gcc -g -o test test.c -I/home/FFmpeg/ffmpeg/ffmpeg-4.1.3 -lavutil 其中-l 后跟着FFmpeg的源码路径 -l后跟着Lib的 名称(Libxxx ,xxx为库的名称,编译的时候填入xxx即可 )
avpriv_io_delete("file_path"); 其中file_path 可以使 url 格式
avpriv_io_move("file_path1","file_path2"); 其中file_path1 重命名为->file_path2
代码:
#include
#include
#include
int main()
{
av_log_set_level(AV_LOG_DEBUG);
int result = avpriv_io_delete("./a.txt");
if(result < 0){
av_log(NULL,AV_LOG_ERROR,"delete file is failed. \n");
return -1;
}else
{
av_log(NULL,AV_LOG_ERROR,"delete file success. \n");
}
//move & rename file
result = avpriv_io_move("./1.txt","./2.txt");
if(result < 0){
av_log(NULL,AV_LOG_ERROR,"rename file is failed. \n");
return -1;
}else
{
av_log(NULL,AV_LOG_ERROR,"rename file success. \n");
}
return 0;
}
~
编译:gcc -g -o test test.c -I/home/FFmpeg/ffmpeg/ffmpeg-4.1.3 -lavutil -lavformat
创建测试文件: touch a.txt && touch 1.txt
AVIODirContext *ctx =NULL; AVIOContext是FFmpeg管理输入输出数据的结构体
AVIODirEntry *entry =NULL; AVIODirEntry 为文件信息的结构体,内部包含 文件名称,大小等信息 ls -all 下的属性
使用 avio_open_dir(&ctx,"路径",NULL); 来打开需要操作的目录路径
使用 avio_read_dir(ctx, &entry); 来读取目录下的每个目录&文件
使用 avio_close_dir(&ctx); 来关闭目录 释放资源
代码:
#include
#include
#include
int main()
{
av_log_set_level(AV_LOG_DEBUG);
int ret;
AVIODirContext *ctx =NULL;
AVIODirEntry *entry =NULL;
ret = avio_open_dir(&ctx,"/home/FFmpeg",NULL);
if(ret <0) {
av_log(NULL, AV_LOG_ERROR,"Cant open dir: %s\n", av_err2str(ret));
return -1;
}
while(1)
{
ret = avio_read_dir(ctx, &entry);
if(ret <0) {
av_log(NULL, AV_LOG_ERROR,"Cant read dir:%s\n", av_err2str(ret));
goto __fail;
}
if(!entry) {
break;
}
av_log(NULL, AV_LOG_INFO,"%12"PRId64" %s \n", entry->size, entry->name);
//释放资源
avio_free_directory_entry(&entry);
}
__fail:
avio_close_dir(&ctx); //关闭文件
return 0;
}
第一节:安装FFmpeg和基本Api的使用 结束
下一节:
FFmpeg 安装+Api使用+Android+笔记( 二)