安装ffmpeg
编译安装基本顺序:yasm→SDL2→ffmpeg。
安装yasm
ffmpeg依赖yasm,所以要先安装yasm。
wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz # 从官方源下载yasm的源码
tar -zxf yasm-1.3.0.tar.gz # 解压源码到当前目录
cd yasm-1.3.0/ # 切换到解压出来的yasm目录
mkdir -p /data/yasm/ # 创建要安装的目标目录
./configure --prefix=/data/yasm/ # 这里可以看到我开始configure并指定目录了
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... no
checking whether make supports nested variables... no
checking whether to enable maintainer-specific portions of Makefiles... no
checking for style of include used by make... none
checking for gcc... no
checking for cc... no
checking for cl.exe... no
# 报错:没有C编译器,笔者的这个Ubuntu是刚安装的,所以没有安装gcc和g++
configure: error: in `/data/yasm-1.3.0':
configure: error: no acceptable C compiler found in $PATH
那么就来安装gcc和g++吧!
sudo apt install gcc g++ # 安装gcc和g++
重新再来一遍!
./configure --prefix=/data/yasm/ # 重新configure
echo $? # 返回0,没报错
make -j1 # 单线程编译
# 又报错了,因为这是刚安装的Ubuntu,所以没有make命令,那就装一个
Command 'make' not found, but can be installed with:
sudo apt install make # version 4.3-4.1build1, or
sudo apt install make-guile # version 4.3-4.1build1
既然没有,那就装一个~
sudo apt install make # 安装make命令
装了make之后再来一遍!
make -j1 # 单线程编译
echo $? # 返回0,没报错
yasm编译成功。
make install # 安装
yasm安装成功
安装SDL2
ffplay依赖SDL2,不安装SDL2,编译出来的ffmpeg里没有ffplay。
wget https://www.libsdl.org/release/SDL2-2.0.14.tar.gz # 从官方源下载SDL2
tar -zxf SDL2-2.0.14.tar.gz # 解压SDL2
cd SDL2-2.0.14/ # 进入解压的目录
./configure # configure
make -j1 # 单线程编译
echo $? # 返回0,无错误
SDL2编译成功。
安装SDL2。
make install # 安装SDL2
# 报错:权限不足,由于没有使用root用户登录,无法读写/usr这个目录,所以要用sudo提权
/usr/bin/install: cannot create regular file '/usr/local/bin/sdl2-config': Permission denied
make: *** [Makefile:166: install-bin] Error 1
提权后再次安装SDL2。
sudo make install
安装ffmpeg
用wget命令在官网下载ffmpeg的最新版本。
wget https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2
一套操作猛如虎~
tar -jxf ffmpeg-snapshot.tar.bz2 # 解压ffmpeg源码包
mv ffmpeg ffmpeg-5.1 # 习惯性改个名字
cd ffmpeg-5.1/ # 切到刚才的目录下
mkdir /data/ffmpeg # 创建一个目标目录
./configure --prefix=/data/ffmpeg --enable-gpl --enable-version3 --enable-nonfree --enable-libfdk-aac --enable-libx264 --enable-libx265 --enable-libspeex --enable-shared --enable-pthreads --enable-hardcoded-tables # 开始configure吧
# 各个选项的解释
--prefix=/data/ffmpeg # 配置安装目录为/data/ffmpeg
--enable-gpl # 启用GPL许可证
--enable-version3 # 将GPL许可证升级为GPL3
--enable-nonfree # 启用nonfree许可证
--enable-libfdk-aac # 开启AAC编解码器
--enable-libx264 # 开启x264编解码器
--enable-libx265 # 开启x265编解码器
--enable-libspeex # 开启speex编解码器
--enable-shared # 构建共享库
--enable-pthreads # 线程保护
--enable-hardcoded-tables # 硬件编码表
报错咯。。
# 报错:未找到yasm
nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
重新编译安装yasm,这次安装到 /usr/local,应该就没问题了!
cd yasm-1.3.0/ # 切换到解压出来的yasm目录
./configure --prefix=/usr/local/ # configure的同时指定目标目录
make -j1 # 再次单线程编译
sudo make install # 必须加sudo才能读写/usr/local目录
再次configure一下ffmpeg!
./configure --prefix=/data/ffmpeg --enable-gpl --enable-version3 --enable-nonfree --enable-libfdk-aac --enable-libx264 --enable-libx265 --enable-libspeex --enable-shared --enable-pthreads --enable-hardcoded-tables
# 报错:找不到libfdk_aac,应该是没安装这个依赖
ERROR: libfdk_aac not found
那就装一下依赖包吧~
sudo apt install libfdk-aac-dev libspeex-dev libx264-dev libx265-dev libnuma-dev # 安装一下刚才没装的依赖
再来一次呗~
./configure --prefix=/data/ffmpeg --enable-gpl --enable-version3 --enable-nonfree --enable-libfdk-aac --enable-libx264 --enable-libx265 --enable-libspeex --enable-shared --enable-pthreads --enable-hardcoded-tables
echo $? # 返回0,正常
开始编译ffmpeg~
make -j1 # 单线程编译
echo $? # 返回0,正常
安装一下ffmpeg~
make install
echo $? # 返回0,正常
安装成功!!
运行一下ffplay试试看~
cd /data/ffmpeg/bin # 切换到ffmpeg安装目录下的bin目录
./ffplay # 运行ffplay
# 报错:找不到库
./ffplay: error while loading shared libraries: libavdevice.so.59: cannot open shared object file: No such file or directory
可以通过修改配置文件,添加库目录来解决上述问题。
sudo vim /etc/ld.so.conf
### 以下是最后一行追加的文件内容 ###
/data/ffmpeg/lib # 这个是ffmpeg安装目录下的lib目录的位置
最后刷新配置即可。
sudo ldconfig # 刷新库文件配置
设置环境变量
刚才要进入ffmpeg安装目录下的bin目录才能启动ffmpeg,我们可以通过设置环境变量的方式,实现全局直接启动ffmpeg。
sudo vim ~/.bashrc # 配置用户环境变量
### 以下是在配置文件除注释外的第一行添加的内容 ###
export PATH="/data/ffmpeg/bin:$PATH"
最后激活环境变量即可。
source ~/.bashrc # 激活环境变量
试试全局启动ffmpeg,成功了!
安装youtube-dl
由于youtube-dl依赖Python3.2+,所以笔者这里选择安装Python3.6.15。
编译安装Python3.6.15
一路操作下来没啥问题~
wget https://www.python.org/ftp/python/3.6.15/Python-3.6.15.tar.xz # 从官方源下载Python3.6.15
tar -Jxf Python-3.6.15.tar.xz # 解压Python-3.6.15
cd Python-3.6.15/ # 切换到解压出来的目录
sudo apt install gcc make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev # 安装编译所需依赖
mkdir /data/python3615 # 创建目标安装目录
./configure --prefix=/data/python3615 # configure
echo $? # 返回0,正常
开始编译~
make -j1 # 单线程编译
echo $? # 返回0,正常
编译报错了。。。
make install # 安装Python3.6.15
# 报错:查了一下资料,大概率是Python3.6.15和gcc-11不兼容导致的。那么换更新Python3.8.13试试
Segmentation fault (core dumped)
make: *** [Makefile:1102: install] Error 139
echo $? # 返回2,错误
既然不兼容,那就换新版本,看看兼容不~
wget https://www.python.org/ftp/python/3.8.13/Python-3.8.13.tar.xz # 从官方源下载Python3.8.13
tar -Jxf Python-3.8.13.tar.xz # 解压Python-3.8.13源码
cd Python-3.8.13/ # 切换到解压出来的目录
mkdir /data/python3813 # 建立安装目录
./configure --prefix=/data/python3813 # configure指定安装目录
echo $? # 返回0,正常
configure起来挺顺利的,编译一下看看~~
make -j1 # 单线程编译
echo $? # 返回0,正常
编译也顺利成功了!
make install # 安装Python-3.8.13
echo $? # 返回0,正常
安装成功了!
cd /data/python3813/bin
./python3.8 -V # 返回版本号,正常
建立VirtualEnvironment(venv)
mkdir /data/ut-dl # 建立项目目录
./python3.8 -m venv /data/ut-dl # 为项目建立venv虚拟环境
cd /data/ut-dl/bin # 切换到项目目录的bin下
source activate # 激活虚拟环境
python -V # 返回版本号,激活成功
安装youtube-dl
pip install youtube_dl
测试下载一个YouTube视频
youtube_dl 'https://www.youtube.com/watch?v=Q-zw1XHu8fY'
发现速度很慢,于是换用其他插件,比如它还在更新的分支yt-dlp。
安装yt-dlp
pip install yt-dlp
再次测试下载一个YouTube视频
yt-dlp 'https://www.youtube.com/watch?v=Q-zw1XHu8fY'
发现50M的视频秒下好,以后就用它了。
尝试用它下载直播
yt-dlp --live-from-start --merge-output-format mp4 -v -N 10 https://www.youtube.com/watch?v=kgx4WGK0oNU
最后发现yt-dlp无法解析YouTube直播的音轨,所以抓取的没有声音,放弃这个方案。
使用yt-dlp解析直播链接并用ffmpeg下载混流
既然yt-dlp下载没有声音,那么笔者想尝试一下通过ffmpeg来下载。
使用yt-dlp解析直播链接
yt-dlp --get-url https://www.youtube.com/watch?v=7egeSWihvMU
https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1659083901/ei/HUjjYovQFaKI0-kPzaSooAs/ip/218.190.230.226/id/7egeSWihvMU.2/itag/96/source/yt_live_broadcast/requiressl/yes/ratebypass/yes/live/1/sgoap/gir%3Dyes%3Bitag%3D140/sgovp/gir%3Dyes%3Bitag%3D137/hls_chunk_host/rr1---sn-ibj-i3be6.googlevideo.com/playlist_duration/30/manifest_duration/30/gcr/hk/vprv/1/playlist_type/DVR/initcwndbps/1002500/mh/mU/mm/44/mn/sn-ibj-i3be6/ms/lva/mv/m/mvi/1/pl/26/dover/11/pacing/0/keepalive/yes/fexp/24001373,24007246/mt/1659061951/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,live,sgoap,sgovp,playlist_duration,manifest_duration,gcr,vprv,playlist_type/sig/AOq0QJ8wRQIgO9w9xAEHK26SyCCfWNsH8caOqxYRjM0pPFMW1bMSDHICIQCbhD42-eH6Ze9Pp9Y8Cq4Ytho92sRLH2xVx8Udq_6hVw%3D%3D/lsparams/hls_chunk_host,initcwndbps,mh,mm,mn,ms,mv,mvi,pl/lsig/AG3C_xAwRgIhAL645gDyITEwgR8pwIbJVGpSn-d753FAm0CnTif33lkHAiEA6KohgGvF3ZG8pEYpNKwj6howXsHYQ_qGpsRIj0LT3pw%3D/playlist/index.m3u8
测试ffmpeg下载直播流
ffmpeg -i https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1659083901/ei/HUjjYovQFaKI0-kPzaSooAs/ip/218.190.230.226/id/7egeSWihvMU.2/itag/96/source/yt_live_broadcast/requiressl/yes/ratebypass/yes/live/1/sgoap/gir%3Dyes%3Bitag%3D140/sgovp/gir%3Dyes%3Bitag%3D137/hls_chunk_host/rr1---sn-ibj-i3be6.googlevideo.com/playlist_duration/30/manifest_duration/30/gcr/hk/vprv/1/playlist_type/DVR/initcwndbps/1002500/mh/mU/mm/44/mn/sn-ibj-i3be6/ms/lva/mv/m/mvi/1/pl/26/dover/11/pacing/0/keepalive/yes/fexp/24001373,24007246/mt/1659061951/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,live,sgoap,sgovp,playlist_duration,manifest_duration,gcr,vprv,playlist_type/sig/AOq0QJ8wRQIgO9w9xAEHK26SyCCfWNsH8caOqxYRjM0pPFMW1bMSDHICIQCbhD42-eH6Ze9Pp9Y8Cq4Ytho92sRLH2xVx8Udq_6hVw%3D%3D/lsparams/hls_chunk_host,initcwndbps,mh,mm,mn,ms,mv,mvi,pl/lsig/AG3C_xAwRgIhAL645gDyITEwgR8pwIbJVGpSn-d753FAm0CnTif33lkHAiEA6KohgGvF3ZG8pEYpNKwj6howXsHYQ_qGpsRIj0LT3pw%3D/playlist/index.m3u8 /data
# 报错:安装ffmpeg时未安装openssl
https protocol not found, recompile FFmpeg with openssl, gnutls or securetransport enabled.
https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1659083901/ei/HUjjYovQFaKI0-kPzaSooAs/ip/218.190.230.226/id/7egeSWihvMU.2/itag/96/source/yt_live_broadcast/requiressl/yes/ratebypass/yes/live/1/sgoap/gir%3Dyes%3Bitag%3D140/sgovp/gir%3Dyes%3Bitag%3D137/hls_chunk_host/rr1---sn-ibj-i3be6.googlevideo.com/playlist_duration/30/manifest_duration/30/gcr/hk/vprv/1/playlist_type/DVR/initcwndbps/1002500/mh/mU/mm/44/mn/sn-ibj-i3be6/ms/lva/mv/m/mvi/1/pl/26/dover/11/pacing/0/keepalive/yes/fexp/24001373,24007246/mt/1659061951/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,live,sgoap,sgovp,playlist_duration,manifest_duration,gcr,vprv,playlist_type/sig/AOq0QJ8wRQIgO9w9xAEHK26SyCCfWNsH8caOqxYRjM0pPFMW1bMSDHICIQCbhD42-eH6Ze9Pp9Y8Cq4Ytho92sRLH2xVx8Udq_6hVw%3D%3D/lsparams/hls_chunk_host,initcwndbps,mh,mm,mn,ms,mv,mvi,pl/lsig/AG3C_xAwRgIhAL645gDyITEwgR8pwIbJVGpSn-d753FAm0CnTif33lkHAiEA6KohgGvF3ZG8pEYpNKwj6howXsHYQ_qGpsRIj0LT3pw%3D/playlist/index.m3u8: Protocol not found
Did you mean file:https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1659083901/ei/HUjjYovQFaKI0-kPzaSooAs/ip/218.190.230.226/id/7egeSWihvMU.2/itag/96/source/yt_live_broadcast/requiressl/yes/ratebypass/yes/live/1/sgoap/gir%3Dyes%3Bitag%3D140/sgovp/gir%3Dyes%3Bitag%3D137/hls_chunk_host/rr1---sn-ibj-i3be6.googlevideo.com/playlist_duration/30/manifest_duration/30/gcr/hk/vprv/1/playlist_type/DVR/initcwndbps/1002500/mh/mU/mm/44/mn/sn-ibj-i3be6/ms/lva/mv/m/mvi/1/pl/26/dover/11/pacing/0/keepalive/yes/fexp/24001373,24007246/mt/1659061951/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,live,sgoap,sgovp,playlist_duration,manifest_duration,gcr,vprv,playlist_type/sig/AOq0QJ8wRQIgO9w9xAEHK26SyCCfWNsH8caOqxYRjM0pPFMW1bMSDHICIQCbhD42-eH6Ze9Pp9Y8Cq4Ytho92sRLH2xVx8Udq_6hVw%3D%3D/lsparams/hls_chunk_host,initcwndbps,mh,mm,mn,ms,mv,mvi,pl/lsig/AG3C_xAwRgIhAL645gDyITEwgR8pwIbJVGpSn-d753FAm0CnTif33lkHAiEA6KohgGvF3ZG8pEYpNKwj6howXsHYQ_qGpsRIj0LT3pw%3D/playlist/index.m3u8?
安装带openssl的ffmpeg
重新来一遍~
cd /data/ffmpeg-5.1
make clean # 清除原有编译的文件
./configure --prefix=/data/ffmpeg --enable-gpl --enable-version3 --enable-nonfree --enable-libfdk-aac --enable-libx264 --enable-libx265 --enable-libspeex --enable-shared --enable-pthreads --enable-hardcoded-tables --enable-openssl # 重新configure一下带openssl的ffmpeg
make -j1 # 单线程编译
echo $? # 返回0,正常
安装新的ffmpeg,
make install # 安装
再次尝试下载。
ffmpeg -i -vcodec copy -acodec copy ./3.mp4
成功下载!
最后一提,回头用了yt-dlp,好像下载下来也是有声音的,不知道是不是我之前操作不对,所以现在两种方法都能用,喜大普奔~~
参考资料:
- [Ubuntu]编译 安装 FFmpeg – 知乎
- FFmpeg/configure at master · FFmpeg/FFmpeg · GitHub
- Linux(Ubuntu)系统下编译源码安装新版 Python 3.X_xietansheng的博客-CSDN博客_python3编译安装
- issue 45700: Got SEGV in compilation python3.6 with GCC-11, and please renewal python3.6. – Python tracker
- virtualenv – 廖雪峰的官方网站
- youtube-dl/README.md at master · ytdl-org/youtube-dl · GitHub
- youtube_dl · PyPI
- ffmpeg over https fails – Stack Overflow
- 使用FFmpeg转录网络直播流 – 程序员秘密
- GitHub – yt-dlp/yt-dlp: A youtube-dl fork with additional features and fixes
- 油管视频下载(2022.6) – 知乎
发表回复