ubuntu之坑(十四)——安装FFmpeg进行本地视频推流(在海思平台上运行)

1.编译x264(没有x264依赖项参考,有则跳过)

参考blog:ubuntu22.04下编译ffmpeg-6.0,并且激活x264编码功能。记录一下踩坑(ERROR: x264 not found using pkg-config)
需要注意:

bash 复制代码
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命令删除脚本中的回车符。你可以运行以下命令:

bash 复制代码
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.9libx264开发笔记(一):libx264介绍、海思平台移植编译

在执行configure命令时使用如下命令:

bash 复制代码
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文件)。

bash 复制代码
sudo cp /home/ss927/workspace/media/local/lib/pkgconfig/x264.pc /usr/share/pkgconfig

最后,使用下面命令将x264放到系统环境变量中去:

bash 复制代码
sudo gedit /etc/profile

在末尾加上:

bash 复制代码
export PATH="/../bin:$PATH"

然后执行:

bash 复制代码
source /etc/profile

通过下面几条命令检查x264是否安装成功:

bash 复制代码
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内容如下:

bash 复制代码
#!/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抓取数据推流即可。

bash 复制代码
./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中加入如下内容:

bash 复制代码
--enable-encoder=h264_v4l2m2m \
--enable-decoder=h264_v4l2m2m \
--enable-encoder=hevc_v4l2m2m \
--enable-decoder=hevc_v4l2m2m

重新生成ffmpeg后,用下面命令验证ffmpeg是否包含v4l2m2m:

bash 复制代码
ffmpeg -encoders | grep h264_v4l2m2m
ffmpeg -decoders | grep h264_v4l2m2m

使用下面命令进行推流:

bash 复制代码
./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
相关推荐
菜包eo4 小时前
基于二维码的视频合集高效管理与分发技术
音视频
文浩(楠搏万)4 小时前
用OBS Studio录制WAV音频,玩转语音克隆和文本转语音!
大模型·音视频·tts·wav·obs·声音克隆·语音录制
kikikidult4 小时前
(2025.07)解决——ubuntu20.04系统开机黑屏,左上角光标闪烁
笔记·ubuntu
BD_Marathon7 小时前
Ubuntu:Mysql服务器
服务器·mysql·ubuntu
0wioiw08 小时前
Ubuntu基础(监控重启和查找程序)
linux·服务器·ubuntu
Tipriest_8 小时前
Ubuntu常用的软件格式deb, rpm, dmg, AppImage等打包及使用方法
linux·运维·ubuntu
GBXLUO8 小时前
windows的vscode无法通过ssh连接ubuntu的解决办法
vscode·ubuntu
aqi0010 小时前
FFmpeg开发笔记(七十二)Linux给FFmpeg集成MPEG-5视频编解码器EVC
android·ffmpeg·音视频·流媒体
笑衬人心。11 小时前
Ubuntu 22.04 修改默认 Python 版本为 Python3 笔记
笔记·python·ubuntu
花开花落的个人博客12 小时前
ESP32-S3开发板播放wav音频
音视频