ffmpeg Linux 安装 和运行
方法一:
1.升级系统
sudo yum install epel-release -y
sudo yum update -y
sudo shutdown -r now
2.安装Nux Dextop Yum 源
由于CentOS没有官方FFmpeg rpm软件包。但是,我们可以使用第三方YUM源(Nux Dextop)完成此工作。
1) CentOS 7
sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
2) CentOS 6
sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm
3.安装FFmpeg 和 FFmpeg开发包
sudo yum install ffmpeg ffmpeg-devel -y
4.测试是否安装成功
ffmpeg
5.如果你想了解更多关于FFmpeg使用方面的资料,可以输入:
ffmpeg -h
例子:
使用FFmpeg将mp3转为ogg
ffmpeg -i MLKDream_64kb.mp3 -c:a libvorbis -q:a 4 MLKDream_64kb.ogg
使用FFmpeg将flv转为mp4
ffmpeg -i beeen.flv -y -vcodec copy -acodec copy beeen.mp4
wpjamer
方法二
一、FFmpeg 简介
FFmpeg 是一款开源的多媒体视频处理工具,它有非常强大的功能包括视频采集、视频格式转换、视频抓图、给视频加水印等。
许多视频播放处理软件多是基于 FFmpeg 开发,包括暴风影音、QQ影音、PotPlaye 等。
注:FFmpeg 是以命令行的方式运行的,所以我们要在终端操作它。
二、音视频基础知识
1、封装:封装即我们常说的文件格式 mp4、avi、mkv、rmvb。它像是一个容器,里面会包含视频、音频、字幕等信息。
2、编码:编码的目的是为了存储和压缩。视频和音频会采用不同的编码方式编码后放进容器中。
常见的视频编码方式有h.264(HVC)、h.265(HEVC)、MPEG4、VC-1等,常见的音频编码方式有AAC、AC-3、MP3等。
注:封装格式会限制编码方式,如 rmvb 在视频方面只支持 RealVideo 8, 9, 10 编码的视频,而 mkv 则支持所有编码方式的音视频。
三、FFmpeg 的安装
我们到 FFmpeg 官网下载它,如下链接,它提供了 Linux、Windows、Mac OS 常见的三个平台的安装包。
https://www.ffmpeg.org/download.html
为了简单我们选择下载静态编译的包,这意味它可以放到任何位置多能正确的被执行。
但为了方便我们通常希望在任何位置打开终端都能运行 FFmpeg,这样我们可以把 FFmpeg 的存放路径添加至系统环境变量即可。
如在 Windows 平台,我们先将下载的静态编译包解压放置到 C:\Program Files\FFmpeg 目录,
然后将其可执行文件路径 C:\Program Files\FFmpeg\bin 添加至系统环境变量里,添加方法如下链接介绍。
https://jingyan.baidu.com/article/47a29f24610740c0142399ea.html
之后我们在任何位置打开终端都可以执行 FFmepg 命令了,Linux 和 Mac OS 平台类似,先下载,然后添加环境变量,即可完成安装。
下面先进行软件安装。
---https://www.videolan.org/developers/x264.html
wget https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.bz2
或下地址:
1.安装x264库
下载libx264包,如果在视频转码时不指定libx264格式,可能会出现转换后的视频或音频不正常
git clone git://git.videolan.org/x264.git
进行简单配置,有些cpu不支持asm汇编语句,使能共享,使能多线程,使能pic
./configure --disable-asm --enable-shared --enable-pthread --enable-pic
编译
make 或可以添加-j
选项来指定并行编译的核心任务数 make -j4
安装,其实就是移动了库文件、可运行文件的位置
make install
2.安装ffmpeg
安装前:
-------------------
apt install gcc nasm yasm
安装完成后,运行nasm -v
或yasm -v
来检查安装的汇编器版本。确保它符合FFmpeg的编译要求
慎用:如果你出于某种原因无法安装NASM或YASM,并且仍然想编译FFmpeg,你可以在配置FFmpeg时使用--disable-x86asm
选项来禁用x86汇编优化。但是,这样做会导致编译出的FFmpeg性能较差,因为它无法利用汇编代码带来的性能提升
--------------------------------
在http://www.ffmpeg.org/download.html下载软件包,我下载的是ffmpeg-4.1.3.tar.bz2。
wget https://ffmpeg.org/releases/ffmpeg-4.1.3.tar.bz2
wget https://ffmpeg.org/releases/ffmpeg-7.0.tar.gz
解压软件
tar -jxvf ffmpeg-4.1.3.tar.bz2
切换目录
cd ffmpeg-4.1.3/
根据服务器进行配置,生成配置文件
./configure --disable-x86asm --enable-gpl --enable-libx264
*****配置X264报错 pkg-config即安装apt install pkgconf查询:pkg-config --list-all | grep x264
编译
make
安装
make install
之后我们可以运行命令,测试一下软件运行是否正常。
ffmpeg -i ./e6a4aa70cb88294a364087ee98ecf502.avi -vcodec libx264 test.mp4
一般情况下,是会报错的,提示找不到libx264.so之类的错误。
/usr/local/lib/添加到/etc/ld.so.conf 文件末尾或者直接修改/etc/ld.so.conf ,需要root权限
echo "/usr/local/lib" >> /etc/ld.so.conf
使库文件的配置生效
ldconfig
此时再试着运行命令,看是否可正确转码。可以看到服务器输出转码成功。
ffmpeg -i ./e6a4aa70cb88294a364087ee98ecf502.avi -vcodec libx264 test.mp4
四、简单的音视频处理操作
4.1 视频剪辑
任务:截取 A 视频的 00:00 - 00:30 和 02:00 - 02:30 两个片段重新拼接成新的视频 B。
step1:截取 A 视频 00:00 - 00:30 片段输出为 A1
/*
* -ss 为指定起始时间
* -t 为指定持续的时长
* -i 为指定输入的视频文件
* -vcodec 为指定输出视频的编码格式,这里为 copy 即不改变原来的编码格式,可加快输出速度
* -acodec 为指定输出音频的编码格式,copy 意义同上
*/
ffmpeg -ss 00:00:00 -t 00:00:30 -i A.mp4 -vcodec copy -acodec copy A1.mp4
step2:截取 A 视频 02:00 - 02:30 片段输出为 A2
ffmpeg -ss 00:02:00 -t 00:00:30 -i A.mp4 -vcodec copy -acodec copy A2.mp4
setp3:拼接 A1 和 A2 输出为 B
ffmpeg -f concat -i list.txt -c copy B.mp4
其中 list.txt 的内容如下:
file ./A1.mp4
file ./A2.mp4
4.2 提取或替换视频背景音
任务:提取视频 A 的背景音输出为 B.mp3
ffmpeg -y -i A.mp4 -vn B.mp3
任务:用 B.mp3 替换视频 C 中的背景音
step1:提取 C 中的视频,去除背景音,输出为无声的视频 D
ffmpeg -i C.mp4 -vcodec copy -an D.mp4
step2:将新的背景音 B 合成到视频 D 中生成新的视频 F
ffmpeg -i D.mp4 -i B.mp3 -vcodec copy -acodec copy F.mp4
4.3 视频转码
这里有两个转换,一个封装的转换,一个编码的转换,我们常说的格式转换即为封装的转换,
但编码格式有时受限于封装格式,所以有时也需要发生编码格式的转换。
若不想关心音视频的编码方式只想换种封装格式,则可不指定编码方式,如下将 mp4 转为 mkv
ffmpeg -i input.mp4 output.mkv
当然我们知道 mkv 是支持任意的音视频编码方式,所以我们可以指定以 copy 的方式来转换可以加快输出速度,如下:
ffmepg -i input.mp4 -vcodec copy -acodec copy output.mkv
另外的要是我们的播放器受限只支持 h.264 编码方式的视频播放,那我们就可以指定输出的视频编码方式,如下:
ffmpeg -i input.mp4 -vcodec h264 -acodec copy output.mkv
其他的我们不仅可以转换视频的封装格式,和编码方式,
我们也可以通过制定其他参数在改变视频的分辨率、码率、帧率等,了解更多可查看器帮助文档。
五、小技巧
1、限制 ffmpeg 的 cpu 使用率
视频处理是一件非常消耗计算力的事情,通常 ffmpeg 会消耗 100% 的 cpu 来做这些事情,
如果你使用的是笔记本,而视频又比较大,100% 的 cpu 使用持续不了几分钟,笔记本的风扇就要狂转,
所以我们情愿多花点时间也不愿意把电脑热坏了,这可以通过限制 ffmpeg 的 cpu 使用率来降低笔记本的负担。
我们通过加入 -threads 参数来实现这一点,如限制 cpu 使用率在 50%,则我们这样做:
ffmpeg -i input.mp4 -threads 2 -vcodec h264 -acodec copy output.mkv
方法三:
vim:
打开需要修改的文件
进入命令模式,输入 :%s/要替换的内容/替换后的内容/g,其中 % 表示对整个文件进行替换,g 表示全局替换。
按下回车键,Vim 会自动替换所有匹配的内容。
你也可以使用正则表达式进行更加灵活的替换操作。例如,如果你想将文件中所有的空格替换为下划线,可以使用以下命令:
:%s/\s/_/g
其中 \s 表示匹配空格,下划线是替换后的内容。
:%s:/old_word/:new_word/ 替换每一行第一个值
:%s:/old_word/:new_word/g 替换全文所有的值
计算文件夹个数
ls -l | grep "^-" | wc -l
windows:
2
方法一:
1.download sourcecode
Windows平台下可以通过命令下载ffmpeg;可以使用MSYS2/MSYS2 MINGW64来下载
如:pacman -S mingw-w64-x86_64-ffmpeg
如需下载libx264/libx265/libfdk-aac则需要下载相应的路,如下:
pacman -S mingw-w64-x86_64-fdk-aac //下载
pacman -S mingw-w64-x86_64-x264
pacman -S mingw-w64-x86_64-x265
ffmpeg.exe -version
2.windows builds by BtbN工具包下载
ffmpeg-master-latest-win64-gpl-shared.zip
ffmpeg-master-latest-win64-gpl.zip
解压执行在cmd终端或者MSYS2运行bin文件下载的ffmpeg.exe -version
方法二:
https://www.gyan.dev/ffmpeg/builds/#release-builds
点击下载ffmpeg-release-essentials.zip
解压添加环境变量
linux:
./configure --enable-gpl --enable-version3 --enable-pthreads --enable-shared --enable-libx264 --enable-pic --enable-libfdk-aac --enable-openssl --enable-nonfree
yum install -y autoconf automake build-essential git libass-dev libfreetype6-dev libsdl2-dev libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo wget zlib1g-dev
方法一:
sudo apt install FFmpeg(ubuntu采用apt/centos采用yum/dnf)
1.更新系统
sudo yum install epel-release -y
sudo yum update -y
sudo shutdown -r now
2.使用安装Nux Dextop YUM
sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
3.安装FFmpeg和FFmpeg开发包
sudo yum install ffmpeg ffmpeg-devel -y
方法二:
https://ffmpeg.org/download.html
http://yasm.tortall.net/Download.html
http://www.videolan.org/developers/x264.html
https://sourceforge.net/projects/opencore-amr/files/fdk-aac/
安装依赖环境
sudo yum -y install make automake gcc gcc-c++ cc kernel-devel glibc-devel make
sudo yum -y install libxml2 libxml2-devel libxslt libxslt-devel
1.最后装wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
或http://www.ffmpeg.org/releases/ffmpeg-5.0.tar.gz
tar -zxvf ffmpeg-5.0.tar.gz -C ../
./configure --enable-gpl --enable-version3 --enable-pthreads --enable-shared --enable-libx264 --enable-static --enable-libfdk-aac --enable-openssl --enable-nonfree
make && make install
warming:
export PATH=$PATH:/path/to/your/pkg-config
#报错 [libavcodec/libavcodec.so.59] Error 1
find / -name libavcodec.so.59
在~/.bash_profile或~/.bashrc或/etc/profile添加环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/your/library
或
vi /etc/ld.so.conf
#原文加入:/usr/local/lib
执行ldconfig
2.wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar -zxvf yasm-1.3.0.tar.gz -C ../
./configure
make && make install
3.wget https://www.nasm.us/pub/nasm/releasebuilds/2.14/nasm-2.14.tar.bz2
# tar -jxvf nasm-2.14.tar.bz2
# cd nasm-2.14
# ./configure
# make & make install
# nasm --version
4.git clone https://code.videolan.org/videolan/x264.git
#cd x264
#./configure --enable-shared
#make & make install
4.wget https://jaist.dl.sourceforge.net/project/opencore-amr/fdk-aac/fdk-aac-2.0.2.tar.gz
#./configure
#make & make install
nginx hls:
server {
listen 8888;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location ~/group[0-9]/ {
ngx_fastdfs_module;
}
}
server {
listen 16666;
server_name localhost;
location / {
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
add_header 'Access-Control-Allow-Headers' 'Range';
add_header 'Content-Type' 'text/plain charset=UTF-8';
root /var/www/html/cct;
index index.html index.htm;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
#add_header 'Access-Control-Allow-Headers' 'Content-Type';
access_log off;
expires max;
}
location /video_hls {
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
add_header 'Access-Control-Allow-Headers' 'Range';
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires 0;
#点播配置
types {
application/vnd.apple.mpegurl;
video/m3u8 ts;
}
alias /var/www/html/cct/public/video_hls/;
index index.html
#加载HLS点播配置
#include hls.conf;
access_log off;
expires max;
}
}
nginx配置RTMP:
#RTMP Server 20231012
rtmp {
server {
listen 1935;
#每个RTMP消息的分片大小
chunk_size 1024;
application live {
live on;
#publish_notify on;
#on_publish http://xx/a.php
record off;
}
application vod {
play /var/www/html/cct/public/public_video;
}
application vod_http {
play http://localhost:1935/vod;
}
application hls {
live on; #应用是直播应用
#hls on; #开启hls流
#hls_path /var/www/html/cct/public/public_video/aa;
#hls_fragment 10s;
record off; #关闭录制
#record_suffix .ts;
#record_unique on;
}
}
}
测试流媒体:
ffmpeg -re -i /var/www/html/cct/public/public_video/eye.mp4 -vcodec copy -acodec copy -b:v 800k -b:a 32k -f flv rtmp://localhost:1935/live
2.ffmpeg -re -i xx.mp4 -vcodec copy -acodec copy -b:v 800k -b:a 32k -f flv -cors 'X-Custom-Header: CustomValue' rtmp://localhost:1935/hls
3.ffmpeg -re -i input.mp4 -vcodec copy -acodec copy -f flv -headers "X-Custom-Header: CustomValue" rtmp://localhost:1935/stream
ffplay rtmp://localhost:1935/live