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

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

相关文章:

  • 软件工程的实践
  • ffmpeg subtitles 字幕不换行的问题解决方案
  • Yarn与NPM缓存存储目录迁移
  • MySQL查询缓存深度剖析
  • ffmpeg rtmp推流源码分析
  • 3GPP协议PDF下载
  • 【信创-k8s】重磅-鲲鹏arm+麒麟V10离线部署k8s1.30+kubesphere4.1.3
  • 从SQL Server到分布式大数据平台:重构企业数据架构
  • 四数之和-力扣
  • Python让自动驾驶“看见未来”:环境建模那些事儿
  • GaussDB 分布式数据库调优(架构到全链路优化)
  • 前端项目Excel数据导出同时出现中英文表头错乱情况解决方案。
  • 用Java实现常见排序算法详解
  • java中合并音频
  • C#使用ExcelDataReader高效读取excel文件写入数据库
  • 【Qt】Qt控件
  • 三星MZQL2960HCJR-00BAL高性能固态硬盘控制器SSD云计算和高端存储专用 电子元器件解析
  • 【为什么InnoDB用B+树?从存储结构到索引设计深度解析】
  • 基于Qt的app开发第十四天
  • 关于B+树的介绍
  • 茶山东莞网站建设/深圳市网络seo推广平台
  • 益阳注册公司/免费网站分析seo报告是坑吗
  • 靠谱网站建设公司价格多少/沈阳头条今日头条新闻最新消息
  • 受欢迎的模板网站建设/郑州疫情最新动态
  • 深圳国内网站制作哪家快/上海全网营销推广
  • 武汉云时代网站建设公司怎么样/重庆seo网络优化咨询热线