ubuntu之坑(十四)——安装FFmpeg进行本地视频推流(在海思平台上运行)
1.编译x264(没有x264依赖项参考,有则跳过)
参考blog:ubuntu22.04下编译ffmpeg-6.0,并且激活x264编码功能。记录一下踩坑(ERROR: x264 not found using pkg-config)
需要注意:
sudo ./configure --enable-static --prefix=/usr/local/x264
在执行上面命令时可能遇到下面问题,这是在Linux系统中运行Shell脚本时可能会遇到一个常见的错误,这个错误通常是由于Shell脚本文件中存在不兼容的换行符引起的。在Windows系统中,文本文件的行尾通常以回车符(CR)和换行符(LF)的组合表示(称为CRLF),而在Linux和Unix系统中,行尾仅以换行符(LF)表示。当你在Windows环境下编写或编辑Shell脚本,然后尝试在Linux系统上运行时,就可能会遇到这个问题。(这里主要是configure、config.sub、config.guess、version.sh四个文件)
“/bin/bash^M: bad interpreter: No such file or directory”
解决这个问题的一种简单方法是使用sed命令删除脚本中的回车符。你可以运行以下命令:
sed -i 's/\r$//' xxx.sh
这条命令的作用是在原地(-i)修改文件,查找每一行末尾的回车符(\r$)并将其删除。这样,文件就会被转换为仅包含换行符(LF)的Unix风格的行尾格式,从而避免了上述错误。如果在本地ubuntu执行到此为止了。
由于我们需要在海思嵌入式平台上安装ffmpeg流媒体,在configure时还需要配置海思的交叉编译链,这里需要对configure进行修改。
参考blog为:海思Hi3536交叉编译ffmpeg 和opencv;海思3519 arm-hisiv500-linux-交叉编译x264、ffmpeg1.2.12、opencv2.4.9;libx264开发笔记(一):libx264介绍、海思平台移植编译
在执行configure命令时使用如下命令:
CC=aarch64-mix210-linux-gcc
./configure --prefix=/home/ss927/workspace/media/local --enable-shared --enable-static --host=aarch64-mix210-linux --cross-prefix=aarch64-mix210-linux- --disable-asm
其中,–prefix 选项是用于指定软件安装的根目录; –enable-shared选项是用于控制是否生成共享库(shared libraries),共享库也称为动态链接库(dynamic libraries),与静态库(static libraries)相对;–enable-static选项用于控制是否生成静态库(static libraries);–host选项用于指定目标主机的平台类型。这个选项在交叉编译(cross-compiling)时特别重要,因为它允许你为不同的目标平台编译软件,而这些平台可能与编译主机(build host)不同;–cross-prefix 选项用于指定交叉编译工具链的前缀。这个前缀通常包括目标平台的架构和操作系统信息,确保 ./configure 脚本使用正确的编译器、链接器和其他工具;–disable-asm选项用于禁用汇编代码的使用,在需要确保编译过程完全使用高级语言(如C或C++)。
一定要进行以下操作,否则编译ffmpeg时会出ERROR: x264 not found using pkg-config的问题。
在/…/lib/pkgconfig/下有一个x264.pc文件,将它移动到/usr/share/pkgconfig下(pkg-config会搜索这个路径下的.pc文件)。
sudo cp /home/ss927/workspace/media/local/lib/pkgconfig/x264.pc /usr/share/pkgconfig
最后,使用下面命令将x264放到系统环境变量中去:
sudo gedit /etc/profile
在末尾加上:
export PATH="/../bin:$PATH"
然后执行:
source /etc/profile
通过下面几条命令检查x264是否安装成功:
pkg-config --exists x264##检查 x264 的配置信息
pkg-config --cflags --libs x264##查看 x264 的详细信息,如果 x264 已正确安装,该命令会输出编译和链接 x264 所需的标志
which x264##查找 x264 可执行文件,如果 x264 已正确安装,该命令会输出 x264 可执行文件的路径
2.编译FFmpeg
参考blog:Ubuntu系统中FFplay的安装与使用;嵌入式开发(四):海思Hi3559AV100交叉编译ffmpeg,这里复现的是海思交叉编译链的配置方法,即从源代码进行编译。
由于FFmpeg配置项较多,这里在解压进入FFmpeg文件夹后创建一个build.sh来管理FFmpeg的编译内容,build.sh内容如下:
#!/bin/bash
./configure \--prefix="/home/ss927/workspace/media/local_ffmpeg"\--enable-filters \--enable-asm \--enable-ffmpeg \--enable-ffplay \--enable-ffprobe \--enable-doc \--enable-cross-compile \--cross-prefix=aarch64-mix210-linux- \--arch=aarch64 \--target-os=linux \--host-os=linux \--enable-gpl \--enable-small \--enable-shared \--enable-static \--enable-encoder=rawvideo \--enable-encoder=mpeg2video \--enable-encoder=mp2 \--enable-encoder=libx264 \--enable-libx264 \--enable-muxer=adts \--enable-muxer=mpegts \--enable-muxer=mpeg2video \--enable-muxer=rtsp \--enable-muxer=hls \--enable-muxer=h264 \--enable-muxer=rtp \--enable-muxer=avi \--enable-muxer=flv \--enable-muxer=mp4 \--enable-demuxer=mpegts \--enable-demuxer=rtsp \--enable-demuxer=hls \--enable-demuxer=h264 \--enable-demuxer=rtp \--enable-demuxer=flv \--enable-muxer=mp4 \--enable-demuxer=mpegts \--enable-demuxer=rtsp \--enable-demuxer=hls \--enable-demuxer=h264 \--enable-demuxer=rtp \--enable-demuxer=flv \--enable-demuxer=avi \--enable-demuxer=mpegps \--enable-demuxer=mpegtsraw \--enable-demuxer=mpegvideo \--enable-parser=aac \--enable-parser=h264 \--enable-parser=mpeg4video \--enable-parser=mpegvideo \--enable-parser=mpegaudio \--enable-bsf=h264_mp4toannexb \--enable-protocol=http \--enable-protocol=rtp \--enable-protocol=rtmpts \--enable-protocol=https \--enable-protocol=hls \--enable-protocol=file \--enable-protocol=data \--enable-gray \--enable-safe-bitstream-reader \--extra-cflags=-I/home/ss927/workspace/media/local/include \--extra-ldflags=-L/home/ss927/workspace/media/local/lib \--disable-stripping \--cc=/opt/linux/x86-arm/aarch64-mix210-linux/bin/aarch64-mix210-linux-gcc \--cxx=/opt/linux/x86-arm/aarch64-mix210-linux/bin/aarch64-mix210-linux-g++ \--enable-swscale\--pkg-config="pkg-config --static"\--ar=/opt/linux/x86-arm/aarch64-mix210-linux/bin/aarch64-mix210-linux-ar\--ranlib=/opt/linux/x86-arm/aarch64-mix210-linux/bin/aarch64-mix210-linux-ranlib
其中,–enable-gpl选项用于启用对 GNU General Public License (GPL) 许可证的支持。这个选项在编译某些开源软件时非常重要,特别是当这些软件依赖于 GPL 许可的代码或库时;–extra-libs选项用于向链接器添加额外的库。这个选项在某些情况下非常有用,特别是当需要链接到特定的库时;–disable-stripping选项用于禁用在安装过程中剥离(strip)可执行文件和库中的符号信息。默认情况下,许多编译配置脚本会在安装时自动剥离符号信息,以减小文件大小并提高安全性。然而,某些情况下可能需要保留这些符号信息;–target-os选项用于指定目标操作系统的类型;–host-os选项用于指定目标主机(host)的操作系统类型;–enable-small选项用于优化生成的可执行文件和库,使其体积尽可能小。–enable-encoder选项用于启用特定的编码器。这个选项在编译多媒体处理软件(如 FFmpeg)时非常有用,因为它允许你选择性地启用或禁用特定的编码器,从而优化生成的可执行文件的大小和功能;–enable-muxer选项用于启用特定的复用器(muxer)。复用器用于将编码后的音频和视频流封装成特定格式的文件(如 MP4、MKV、AVI 等)。这个选项在编译多媒体处理软件(如 FFmpeg)时非常有用,因为它允许你选择性地启用或禁用特定的复用器,从而优化生成的可执行文件的大小和功能;–enable-demuxer选项用于启用特定的解复用器(demuxer)。解复用器用于从多媒体文件中提取音频和视频流,以便进行解码和处理。这个选项在编译多媒体处理软件(如 FFmpeg)时非常有用,因为它允许你选择性地启用或禁用特定的解复用器,从而优化生成的可执行文件的大小和功能;–enable-parser选项用于启用特定的解析器(parser)。解析器在多媒体处理软件(如 FFmpeg)中用于解析编码后的音频和视频流,提取必要的信息(如帧类型、时间戳等),以便进行解码和处理。这个选项允许你选择性地启用或禁用特定的解析器,从而优化生成的可执行文件的大小和功能;–enable-bsf选项用于启用特定的比特流过滤器(Bit Stream Filter,简称 BSF)。比特流过滤器在多媒体处理软件(如 FFmpeg)中用于对编码后的比特流进行处理和转换,例如修复损坏的流、添加或移除特定信息等。这个选项允许你选择性地启用或禁用特定的比特流过滤器,从而优化生成的可执行文件的大小和功能;–enable-protocol选项用于启用特定的协议。协议在多媒体处理软件(如 FFmpeg)中用于支持不同的输入和输出数据传输方式,例如文件、网络流、管道等。这个选项允许你选择性地启用或禁用特定的协议,从而优化生成的可执行文件的大小和功能;–enable-gray 选项用于启用对灰度(Gray Scale)格式的支持;–enable-swscale用于启用软件缩放(Software Scaling,简称 SWScale)功能。SWScale 是 FFmpeg 中的一个库,用于在不同像素格式和分辨率之间进行图像的缩放和格式转换;–disable-avresample 是 FFmpeg 编译配置中的一个选项,用于启用音频重采样(Audio Resampling)功能。音频重采样是指将音频从一种采样率转换为另一种采样率的过程,例如从 44.1 kHz 转换为 48 kHz。这个功能在多媒体处理中非常重要,特别是在处理不同音频格式和设备时;–ar=arm-himix200-linux-ar选项用于指定特定的归档工具(archiver)路径。归档工具通常用于创建和管理静态库(.a 文件)。这个选项在交叉编译(cross-compiling)时特别有用,因为它允许你指定目标平台的归档工具,而不是使用默认的系统工具;–ranlib=arm-himix200-linux-ranlib是 FFmpeg 编译配置中的一个选项,用于指定特定的 ranlib 工具路径。ranlib 是一个用于生成静态库索引的工具,通常与 ar(归档工具)一起使用,以优化静态库的访问速度;
接着进行make和make install,就完成了FFmpeg的编译。由于不需要在本地运行,环境变量这些导入就没有弄。
3.FFmpeg将本地视频进行推流
(1)软编解码推流
打开mediamtx,设置rtsp推流端口号8564,使用下面命令进行推流后用wireshark抓取数据推流即可。
./ffmpeg -re -i visible_2025-04-25_09-56-09.mp4 -rtsp_transport udp -f rtsp rtsp://192.168.0.125:8564/test
(2)硬编解码推流(还在测试)
在编译ffmpeg时,需要在build.sh时加入h264_v4l2m2m编解码器,即在build.sh中加入如下内容:
--enable-encoder=h264_v4l2m2m \
--enable-decoder=h264_v4l2m2m \
--enable-encoder=hevc_v4l2m2m \
--enable-decoder=hevc_v4l2m2m
重新生成ffmpeg后,用下面命令验证ffmpeg是否包含v4l2m2m:
ffmpeg -encoders | grep h264_v4l2m2m
ffmpeg -decoders | grep h264_v4l2m2m
使用下面命令进行推流:
./ffmpeg -re -i visible_2025-04-25_09-56-09.mp4 -c:v h264_v4l2m2m -f null -rtsp_transport udp -f rtsp rtsp://192.168.0.125:8564/test