ffmpeg除了提供了一些跨平台的开发库,还提供了三个开源的命令行工具:
- ffmpeg:是一种非常快速的视频和音频转换器,源数据也可以从实时音频/视频源中获取。它还可以在任意采样率之间转换,并使用高质量的多相滤波器即时调整视频大小。
- FFplay:是使用FFmpeg库和SDL库实现的一个简单且可移植的媒体播放器。它主要用作各种FFmpeg API的测试平台。
- ffprobe:从多媒体流中收集信息,并以人类和机器可读的方式进行显示的工具。
用FFMPEG有一段时间了,但还没有仔细学习过FFMPEG工具(ffmpeg、ffplay)的代码。在分析代码之前,还是需要搭建一个合适的开发环境。大致的环境如下图所示:
Raspberry Pi端:
- 我选用的硬件是树莓派4b 8G版本,准备SD卡并烧录官方系统:https://www.raspberrypi.org/software/operating-systems/#raspberry-pi-os-32-bit
- 在树莓派系统中下载ffmpeg 4.3.1的源代码并编译(这部分就不细说了,优快云有很多很好的资料),编译时指定编译目录,目录结构如下
_build---
|-- bin
|-- include
|-- lib
|-- share - 创建一个代码的工作目录(如:/home/pi/Documents/rasp/demo),并安装gdbserver:sudo apt-get install gdbserver,用于远程调试
Ubuntu 端
- 安装nginx和http-flv模块,nginx 1.18.0、nginx-http-flv-module 1.2.7
sudo apt-get install gcc sudo apt-get install libpcre3 libpcre3-dev sudo apt-get install zlib1g zlib1g-dev # Ubuntu14.04的仓库中没有发现openssl-dev,由下面openssl和libssl-dev替代 #apt-get install openssl openssl-dev sudo apt-get install openssl sudo apt-get install libssl-dev sudo ./configure \ --prefix=/opt/nginx/ \ --with-http_ssl_module \ --add-module=/opt/nginx-http-flv-module-1.2.7
- 配置nginx的RTMP服务(生成一个ssl的证书配置https)
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } # HTTPS server # server { listen 443 ssl; server_name localhost; ssl_certificate cert.pem; ssl_certificate_key cert.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root /home/wangwxl/Documents/html; index index.html index.htm; } location /live { flv_live on; } } } rtmp { server { listen 1985; #not default port 1935 application myapp { live on; gop_cache on; } } }
测试ffmpeg和rmtp推流
- 在树莓派端的ffmpeg/bin目录下运行指令:(Bird.mp4是一个测试视频可以随意指定)
ffmpeg -re -i /home/pi/Birds.mp4 -c copy -f flv rtmp://<IP of Ubuntu Server>:1985/myapp/demo
- 在MacOS上可以通过VLC播放视频:rtmp://<IP of Ubuntu Server>:1985/myapp/demo
MacOS端
- 安装jetbrains的C/C++开发工具Clion:https://www.jetbrains.com/clion/
- 准备ffmpeg(命令行工具的代码):可以从我的github上直接下载:https://github.com/edimy-wxl/learning_ffmpeg.git
- 用Clion打开代码目录
- 打开 Preference --> Build, Execution, Deployment --> Deployment,配置连接树莓派
- 同一个配置界面配置Mac端和树莓派端的代码同步目录
- 打开 Preference --> Build, Execution, Deployment --> Toolchains,这里配置的toolchain是树莓派端的
- 打开 Preference --> Build, Execution, Deployment --> CMake,配置一个Debug的profile
- 添加一个Debug配置
- 运行后Clion控制台显示cmake编译成功的信息,并在树莓派的同步目录中查看编译后的可执行程序:
- 用之前的推流指令测试编译后的可执行程序
- 通过gdbserver启动ffmpeg,并指定端口,在clion程序入口添加断点,点击Debug按钮,测试远程调试
gdbserver :1234 ./ffmpeg -re -i /home/pi/Birds.mp4 -c copy -f flv rtmp://<IP of Ubuntu Server>:1985/myapp/demo
到此开发环境以及搭建完成,后续将详细学习ffmpeg、ffplay、ffprob的源代码