当前位置: 首页 > ds >正文

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
http://www.xdnf.cn/news/14218.html

相关文章:

  • UVM同步的方法
  • RPT:预训练新范式,用强化学习做预训练!
  • 生成式AI如何与RPA融合?
  • Cursor-1.0安装Jupyter-Notebook,可视化运行.ipynb文件中Python分片代码
  • 使用麒麟V10操作系统的KVM服务,但麒麟V10存在高危漏洞无法修复?
  • 【运维】iDRAC、Lifecycle Controller、Unified Server Configurator 的区别
  • 【1/2, 2/3, 3/5, 5/8, 8/13, ...写一个函数,计算以下数列的前10项之和,在主函数中调用该函数并输出结果。】2022-5-19
  • 成都鼎讯短波通信信号模拟设备:短波频段的电磁模拟王者​
  • 【iSAQB软件架构】良好的设计技术
  • spring:使用注解@Configuration、@ComponentScan创建配置类(未完待续)
  • mysql8数据库本地能连上但是远程连不上
  • AI作画提示词:Prompts工程技巧与最佳实践
  • GEO指南之内容创业者:AI时代的“品牌大模型种草”与IP推荐力打造
  • OSPF基础实验案例
  • Java登录验证后台实现详解
  • 【QSoundEffect QT 音频文件的播放】
  • 岛屿周长问题的三种解法:直接计数法、数学计算法与深度优先搜索
  • 精益数据分析(100/126):SaaS行业付费注册率优化与商业模式选择策略
  • Vue3本地存储实现方案
  • java通过hutool工具生成二维码实现扫码跳转功能
  • 【C/C++ 为什么 unique_ptr 不支持拷贝构造、赋值构造等操作】
  • SpringBoot项目接入DeepSeek指南:从零开始实现AI能力整合
  • PyTorch优化器总结
  • JS进阶 Day01
  • 前端面经整理【1】
  • 人工智能嵌入公共服务治理的风险挑战(一)
  • meshgpt 笔记2
  • 企业AI深水区突围:从星辰大海到脚下泥泞的进化论
  • 第六天 界面操作及美化(6.2 控件属性节点)
  • 组件化 websocket