背景
最近我一直在研究怎么把后端的视频流到前端去。后端我选用了python写,使用了框架uwsgi。前端我用的以前的代码修修补补,用的react框架。中间件用的nginx。后端转码的工具使用ffmpeg。
如果是静态文件就比较好做。但是我的想法是,后端因为有各种各样的格式的电影和电视剧,通过后端在线转码,转一点送一点到前端去。再加上本来我的磁盘也不够用,这样就不用落盘了。但是我真是太业余了,只能实现一点点。
ffmpeg
安装
nginx和uwsgi的安装之前已经讲过了,就剩下ffmpeg的安装,也是大差不差,总的来说就是安装ffmpeg的官方仓库,然后使用yum安装。
在没有安装仓库前list
ffmpeg:
[appadmin@localhost ~]$ yum list *ffmpeg*
CentOS Stream 8 - AppStream 5.1 kB/s | 4.4 kB 00:00
CentOS Stream 8 - AppStream 2.1 MB/s | 33 MB 00:16
CentOS Stream 8 - BaseOS 3.9 kB/s | 3.9 kB 00:00
CentOS Stream 8 - BaseOS 12 MB/s | 50 MB 00:04
CentOS Stream 8 - Extras 3.2 kB/s | 2.9 kB 00:00
CentOS Stream 8 - Extras common packages 3.0 kB/s | 3.0 kB 00:01
MariaDB 5.0 kB/s | 3.4 kB 00:00
nginx stable repo 4.4 kB/s | 2.9 kB 00:00
错误:没有匹配的软件包可以列出
[appadmin@localhost ~]$ yum list *ffmpeg*
上次元数据过期检查:0:00:09 前,执行于 2023年10月19日 星期四 17时30分51秒。
错误:没有匹配的软件包可以列出
ffmpeg的官网上对redhat系列的安装步骤链接到rpmfusion仓库的网址:http://www.ffmpeg.org/download.html#build-linux
rpmfusion仓库安装步骤:https://rpmfusion.org/Configuration
在rpmfusion仓库安装步骤中搜索RHEL or compatible like CentOS
。然后根据步骤一个一个命令执行就ok了。
查看rpmfusion
是否安装成功:
[root@localhost ~]# ls -l /etc/yum.repos.d/
总用量 88
-rw-r--r--. 1 root root 713 3月 28 2022 CentOS-Stream-AppStream.repo
-rw-r--r--. 1 root root 698 3月 28 2022 CentOS-Stream-BaseOS.repo
-rw-r--r--. 1 root root 316 3月 28 2022 CentOS-Stream-Debuginfo.repo
-rw-r--r--. 1 root root 744 3月 28 2022 CentOS-Stream-Extras-common.repo
-rw-r--r--. 1 root root 700 3月 28 2022 CentOS-Stream-Extras.repo
-rw-r--r--. 1 root root 734 3月 28 2022 CentOS-Stream-HighAvailability.repo
-rw-r--r--. 1 root root 696 3月 28 2022 CentOS-Stream-Media.repo
-rw-r--r--. 1 root root 683 3月 28 2022 CentOS-Stream-NFV.repo
-rw-r--r--. 1 root root 718 3月 28 2022 CentOS-Stream-PowerTools.repo
-rw-r--r--. 1 root root 690 3月 28 2022 CentOS-Stream-RealTime.repo
-rw-r--r--. 1 root root 748 3月 28 2022 CentOS-Stream-ResilientStorage.repo
-rw-r--r--. 1 root root 1771 3月 28 2022 CentOS-Stream-Sources.repo
-rw-r--r-- 1 root root 1680 4月 17 2023 epel-modular.repo
-rw-r--r-- 1 root root 1332 4月 17 2023 epel.repo
-rw-r--r-- 1 root root 1779 4月 17 2023 epel-testing-modular.repo
-rw-r--r-- 1 root root 1431 4月 17 2023 epel-testing.repo
-rw-r--r-- 1 root root 572 10月 12 14:56 MariaDB.repo
-rw-r--r-- 1 root root 398 10月 12 10:25 nginx.repo
-rw-r--r-- 1 root root 1026 1月 30 2019 rpmfusion-free-updates.repo
-rw-r--r-- 1 root root 1098 1月 30 2019 rpmfusion-free-updates-testing.repo
-rw-r--r-- 1 root root 1071 1月 30 2019 rpmfusion-nonfree-updates.repo
-rw-r--r-- 1 root root 1143 1月 30 2019 rpmfusion-nonfree-updates-testing.repo
仓库安装完成后list
ffmpeg:
[root@localhost ~]# yum list *ffmpeg*
RPM Fusion for EL 8 - Free - Updates 197 kB/s | 310 kB 00:01
RPM Fusion for EL 8 - Nonfree - Updates 88 kB/s | 93 kB 00:01
可安装的软件包
ffmpeg.x86_64 4.2.9-1.el8 rpmfusion-free-updates
ffmpeg-devel.x86_64 4.2.9-1.el8 rpmfusion-free-updates
ffmpeg-libs.x86_64 4.2.9-1.el8 rpmfusion-free-updates
ffmpegthumbnailer.x86_64 2.2.0-9.el8 rpmfusion-free-updates
ffmpegthumbnailer-devel.x86_64 2.2.0-9.el8 rpmfusion-free-updates
mythffmpeg.x86_64 33.1-2.15.20230725git402c6d7758.el8 rpmfusion-free-updates
python3-ffmpeg-normalize.noarch 1.23.1-1.el8 rpmfusion-free-updates
python3-ffmpeg-progress-yield.noarch 0.2.0-1.el8 rpmfusion-free-updates
[root@localhost ~]#
执行yum install ffmpeg
使用
subprocess
我这次使用的python,所以开了一个subprocess
的进程,该进程可以直接使用宿主机上的命令。
import subprocess
ffmpeg_command1 = [
"ffmpeg",
"-ss", str(ss),
"-t", str(t),
"-copyts",
"-start_at_zero",
"-i", video_path,
"-f", "mp4",
"-vcodec", "libx264",
"-acodec", "aac",
"-channel_layout", "stereo",
"-movflags", "frag_keyframe+default_base_moof+empty_moov",
"pipe:",
]
ffmpeg_command2=f'ffmpeg -i {video_path} -c:a aac -c:v libx264 -map 0 -map 0 -b:v:0 800k -b:v:1 300k -s:v:1 320x170 -bf 1 -keyint_min 120 -g 120 -sc_threshold 0 -b_strategy 0 -ar:a:1 22050 -use_timeline 1 -use_template 1 -adaptation_sets "id=0,streams=v id=1,streams=a" -single_file 1 -f dash pipe:'
pipe = subprocess.Popen(ffmpeg_command1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
outs, errs = pipe.communicate()
pipe.wait()
ffmpeg-python
使用python集成版本的ffmpeg:ffmpeg-python
:https://github.com/kkroening/ffmpeg-python
安装
- 安装ffmpeg
安装ffmpeg-python
pip install ffmpeg-python
使用
import ffmpeg proc = ( ffmpeg .input(video_path,ss=ss,t=t) .output("pipe:",format="mp4",vcodec="libx264",acodec="aac",channel_layout="stereo", movflags="frag_keyframe+default_base_moof+empty_moov") .run(cmd="ffmpeg",capture_stdout=True) ) proc return (out, err)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。