灬小肥狗灬
1
灬小肥狗之家灬

【原创】记一次利用FFmpeg和yt-dlp从YouTube爬取直播流的经过

安装ffmpeg

编译安装基本顺序:yasm→SDL2→ffmpeg。

安装yasm

ffmpeg依赖yasm,所以要先安装yasm。

wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz  # 从官方源下载yasm的源码

wget下载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

无C编译器

那么就来安装gcc和g++吧!

sudo apt install gcc g++  # 安装gcc和g++

重新再来一遍!

./configure --prefix=/data/yasm/  # 重新configure
echo $?  # 返回0,没报错

第二次configure没报错

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

无make命令

既然没有,那就装一个~

sudo apt install make  # 安装make命令 

装了make之后再来一遍!

make -j1  # 单线程编译
echo $?  # 返回0,没报错

yasm编译成功。

成功编译yasm

make install  # 安装

yasm安装成功

成功安装yasm

安装SDL2

ffplay依赖SDL2,不安装SDL2,编译出来的ffmpeg里没有ffplay。

wget https://www.libsdl.org/release/SDL2-2.0.14.tar.gz  # 从官方源下载SDL2

wget下载SDL2-2.0.14

tar -zxf SDL2-2.0.14.tar.gz  # 解压SDL2
cd SDL2-2.0.14/  # 进入解压的目录
./configure  # configure

SDL第一次configure成功


make -j1  # 单线程编译
echo $?  # 返回0,无错误

SDL2编译成功。

成功编译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

第一次安装SDL报错

提权后再次安装SDL2。

sudo make install

第二次安装SDL成功

安装ffmpeg

用wget命令在官网下载ffmpeg的最新版本。

wget https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2

wget下载ffmpeg

一套操作猛如虎~

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.

ffmpeg第一次configure出错(未发现yasm)

重新编译安装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

ffmpeg第二次configure出错(未发现libfdk_aac)

那就装一下依赖包吧~

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第三次configure成功

开始编译ffmpeg~

make -j1  # 单线程编译
echo $?  # 返回0,正常

ffmpeg编译成功

安装一下ffmpeg~

make install
echo $?  # 返回0,正常

ffmpeg安装成功

安装成功!!

运行一下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

执行ffplay报错:找不到库

可以通过修改配置文件,添加库目录来解决上述问题。

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,成功了!

全局启动ffmpeg

安装youtube-dl

由于youtube-dl依赖Python3.2+,所以笔者这里选择安装Python3.6.15。

编译安装Python3.6.15

Python-3.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,正常

Python-3.6.15成功configure

开始编译~

make -j1  # 单线程编译
echo $?  # 返回0,正常

Python-3.6.15成功编译

编译报错了。。。

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,正常

Python-3.8.13第一次configure成功

configure起来挺顺利的,编译一下看看~~

make -j1  # 单线程编译
echo $?  # 返回0,正常

Python-3.8.13第一次编译成功

编译也顺利成功了!

make install  # 安装Python-3.8.13
echo $?  # 返回0,正常

Python-3.8.13第一次安装成功

安装成功了!

cd /data/python3813/bin
./python3.8 -V  # 返回版本号,正常

Python-3.8.13第一次返回版本号

建立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,正常

带openssl的ffmpeg成功编译

安装新的ffmpeg,

make install  # 安装

带openssl的ffmpeg成功安装

再次尝试下载。

ffmpeg -i  -vcodec copy -acodec copy ./3.mp4

成功下载!

成功用ffmpeg下载youtube的直播

最后一提,回头用了yt-dlp,好像下载下来也是有声音的,不知道是不是我之前操作不对,所以现在两种方法都能用,喜大普奔~~

参考资料:

  1. [Ubuntu]编译 安装 FFmpeg – 知乎
  2. FFmpeg/configure at master · FFmpeg/FFmpeg · GitHub
  3. Linux(Ubuntu)系统下编译源码安装新版 Python 3.X_xietansheng的博客-CSDN博客_python3编译安装
  4. issue 45700: Got SEGV in compilation python3.6 with GCC-11, and please renewal python3.6. – Python tracker
  5. virtualenv – 廖雪峰的官方网站
  6. youtube-dl/README.md at master · ytdl-org/youtube-dl · GitHub
  7. youtube_dl · PyPI
  8. ffmpeg over https fails – Stack Overflow
  9. 使用FFmpeg转录网络直播流 – 程序员秘密
  10. GitHub – yt-dlp/yt-dlp: A youtube-dl fork with additional features and fixes
  11. 油管视频下载(2022.6) – 知乎
# # # # # # # # # # # #
首页      IT      心得分享      【原创】记一次利用FFmpeg和yt-dlp从YouTube爬取直播流的经过

灬小肥狗灬

文章作者

发表回复

textsms
account_circle
email

13 − 11 =

灬小肥狗之家灬

【原创】记一次利用FFmpeg和yt-dlp从YouTube爬取直播流的经过
安装ffmpeg 编译安装基本顺序:yasm→SDL2→ffmpeg。 安装yasm ffmpeg依赖yasm,所以要先安装yasm。 yasm官网 yasm下载页 笔者使用的yasm-1.3.0的下载地址 wget http://www.tortall.net/p…
扫描二维码继续阅读
2022-07-29