当下直播应用很火,在音视频领域,FFmpeg相当知名。可能你用的一些视频播放器背后都有它的身影。FFmpeg是一个开源的跨平台多媒体处理工具,可以用于处理音视频流、转码、封装、解封装等操作,且支持多种格式和协议。它的视频采集功能也非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,且支持直播应用。
1. 转码:将一种格式的音视频文件转换为另一种格式,例如将MP4文件转换为AVI文件,或将H.264编码的视频转换为VP9编码的视频等。(解码,音视频播放器内核)
2. 剪辑:从一个音视频文件中截取出一段或多段内容,例如将一个长视频剪辑成多个短视频,或将一段音频剪辑出来作为铃声等。
3. 抓取:从摄像头或屏幕等设备中抓取音视频流,例如将摄像头的视频流抓取下来进行录制或直播等。(音视频采集)
4. 处理:对音视频流进行处理,例如添加水印、字幕、特效等,或进行降噪、去抖动、降低码率等处理。
5. 分离和合并:将一个音视频文件中的音频和视频分离出来,或将多个音视频文件合并成一个文件。(格式转换)
6. 直播:将音视频流实时推送到服务器上,或从服务器上拉取音视频流进行实时播放。
举例:在Linux平台上,ffmpeg对V4L2的视频设备提供了很好的支持。如:
以上命令表示:采集10秒钟视频,对video4linux2视频设备进行采集,采集QCIF(176*144)的视频,每秒8帧,视频设备为/dev/video0,视频编码为H263,输出格式为RTP,后面定义了IP地址及端口,将该码流所对应的SDP文件重定向到/tmp/ffmpeg.sdp中,将此SDP文件上传到流媒体服务器(如live555)就可以实现直播了。
FFmpeg提供了libavformat库,其中包含了RTSP协议的实现,可以直接使用该库来拉取RTSP流。在使用FFmpeg拉取RTSP流时,可以使用类似如下的命令:
其中, rtsp://xxx.xxx.xxx.xxx/xxx 是RTSP流的URL地址, 表示直接复制流数据,不进行编解码, 是输出文件名。除了命令行方式,FFmpeg还提供了API接口,可以在程序中使用该接口来拉取RTSP流。
总之,FFmpeg是一个功能强大的多媒体处理工具,可以用于处理各种音视频文件,提供了丰富的功能和API,可以满足各种多媒体处理需求。
Download FFmpeg
GitHub - FFmpeg/FFmpeg: Mirror of https://git.ffmpeg.org/ffmpeg.git
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源工具组合。
它包含一系列的模块。
1. libavcodec:音视频编解码库,提供了多种编解码器,可以支持多种音视频格式的编解码操作。
2. libavformat:音视频封装和解封装库,提供了多种封装格式的支持,可以读取和写入多种音视频文件格式。
3. libavfilter:音视频过滤器库,提供了多种音视频过滤器,可以对音视频流进行各种处理,如添加水印、调整亮度、对比度等。
4. libavdevice:音视频输入输出设备库,提供了多种输入输出设备的支持,如摄像头、麦克风等。
5. libswscale:视频图像缩放库,提供了多种图像缩放算法,可以对视频图像进行缩放操作。
6. libswresample:音频重采样库,提供了多种音频重采样算法,可以对音频进行重采样操作。
7.libavutil:包含一些公共的工具函数。
8. libswscale:用于视频场景比例缩放、色彩映射转换。
9.libpostproc:用于后期效果处理。
10.ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等。
11.ffsever:一个 HTTP 多媒体即时广播串流服务器。
12.ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示。
这些模块可以单独使用,也可以组合使用,实现各种音视频处理操作。例如,可以使用libavcodec进行音视频编解码,使用libavformat进行音视频封装和解封装,使用libavfilter进行音视频过滤操作等。FFmpeg提供了丰富的模块组合。
以下是使用ffmpeg编译的步骤:
1.首先,您需要下载ffmpeg的源代码。您可以从官方网站(https://ffmpeg.org/download.html)下载最新版本的源代码。
2. 下载完成后,您需要解压缩源代码。可以使用以下命令解压缩: tar -zxvf ffmpeg-xxx.tar.gz 其中,xxx是ffmpeg版本号。
3. 接下来,您需要安装一些编译工具和依赖库。您可以使用以下命令安装: sudo apt-get install build-essential sudo apt-get install libmp3lame-dev libx264-dev libopus-dev libvpx-dev libssl-dev
4. 安装完成后,您可以进入解压缩后的ffmpeg目录,并使用以下命令编译: https://blog.csdn.net/yyz_1987/article/details/configure --enable-gpl --enable-libmp3lame --enable-libx264 --enable-libopus --enable-libvpx --enable-openssl
make, make install
以上命令将启用一些常用的编解码器和库,如MP3、H.264、Opus和VP8/VP9。如果您需要其他功能,请查看ffmpeg文档并相应地配置。libopus是一个开源的音频编解码器,它提供了高质量的语音和音乐编码。libvpx是一个开源的视频编解码器,它提供了高质量的视频编码和解码。它们都是在ffmpeg中支持的编解码器之一。 libssl是一个加密库,它提供了安全的套接字层(SSL)和传输层安全(TLS)协议的实现。在ffmpeg中使用libssl可以支持HTTPS协议。 如果您需要支持HTTPS协议,则需要安装libssl。如果您不需要支持HTTPS协议,则可以不安装libssl。
5. 编译完成后,您可以使用以下命令验证是否成功安装: ffmpeg -version 如果成功安装,将显示ffmpeg的版本信息。
注:(视频用 libx264,音频用 libmp3lame。但是基于默认配置而编译的 ffmpeg 不包含这俩编码器,他们属于第三方编码器,linux的x64直接sudo安装依赖即可,但若交叉编译,则需要自己下载这俩编码器的源码,自己先编译成库供FFmpeg使用。)
依赖的三方库地址
lame:
官网在这里 https://lame.sourceforge.io/
页面链接到这里:https://sourceforge.net/projects/lame/files/lame/
本人下载的版本是 3.100 ( lame-3.100.tar.gz )
x264:
以下使用的FFmpeg,用的 ffmpeg 4.4版本为例。
fmpeg的常用编译参数如下:
- --enable-shared:启用共享库的编译,生成.so文件,可以被其他程序调用。
- --enable-static:启用静态库的编译,生成.a文件,可以被其他程序静态链接。 - --enable-gpl:启用GPL许可证的代码。
- --enable-version3:启用LGPLv3许可证的代码。
- --enable-libx264:启用x264编解码器。
- --enable-libx265:启用x265编解码器。
- --enable-libvpx:启用VP8/VP9编解码器。
- --enable-libopus:启用Opus编解码器。
- --enable-libmp3lame:启用MP3编码器。
- --enable-libfdk-aac:启用AAC编码器。
- --enable-libvorbis:启用Vorbis编码器。
- --enable-libtheora:启用Theora编码器。
- --disable-yasm:禁用yasm汇编优化。
- --disable-asm:禁用汇编优化。
其中,--enable-shared、--enable-static、--enable-gpl、--enable-version3、--disable-yasm这些选项是比较重要的。
如果需要使用x264、x265、VP8/VP9、Opus等编解码器,则需要启用相应的选项。如果需要精简体积和提高速度,可以禁用一些不必要的编解码器和过滤器,例如--disable-libvpx、--disable-libtheora等。但是,禁用汇编优化可能会影响编解码性能,因此x86或x64下不建议禁用汇编优化。若是嵌入式平台移植需要,则需要禁用汇编。
配置参数
注:--enable-gpl含义,该选项启用了GPL许可证的代码。--enable-version3选项是与--enable-gpl选项相关的。如果您启用了--enable-gpl选项,那么您可以选择启用--enable-version3选项,以允许使用LGPLv3许可证的代码。LGPLv3是一种自由软件许可证,它比GPLv2更严格,并且允许链接到不同的库。如果您不启用--enable-version3选项,则只能使用LGPLv2.1许可证的代码。
如果不启用--enable-gpl和--enable-version3选项,您仍然可以编译成功,但将无法使用一些GPL许可证或LGPLv3许可证的代码,例如x264、x265、libvpx等编解码器和一些过滤器。这意味着您将无法进行H.264、H.265等常见的视频编码和解码,也无法应用某些过滤器。 如果您只需要使用一些基本的编解码器和过滤器,那么禁用--enable-gpl和--enable-version3选项可能不会对您的应用程序造成太大影响。但是,如果您需要使用某些高级编解码器或过滤器,则必须启用这些选项以便使用它们。此外,如果您使用了启用了GPL许可证的代码,那么您的代码也必须使用GPL许可证发布。
--extra-cflags、 --extra-ldflags 是显示指示模块的头文件与库文件的位置。
--extra-libs 是指定链接到哪个库文件,如果不指定,应该是使用在配置文件里已经设置了的默认值。
在x64平台西编译很简单,安装两个依赖库:
执行configure配置:
如果要支持alsa声卡设备,还需要安装依赖:sudo apt-get install libasound-dev
并增加配置选项:--enable-alsa:开启ALSA音频驱动程序支持;
如果要想生成ffplay,需要SDL2库的支持。sudo apt-get install libsdl2-dev
日志:
交叉编译工具链,环境变量配置:
LAME库的交叉编译
在sourceforge下载最新版本,我下载的版本是3.100。
你以为这就正常了吗?注意这个有个坑啊,指定的cc=无效,指定的--host才是交叉工具链的前缀。我的工具链是arm-fsl-linux-gnueabi-gcc,所以--host需要改为如下:
x264库交叉编译
下载地址:x264, the best H.264/AVC encoder - VideoLAN
ffmpeg交叉编译
测试验证
FFmpeg —— 录制本地麦克风音频进行UDP推流,并进行拉流音频播放
使用ffmpeg命令采集音频
其次,我们需要知道,麦克风这个文件格式是什么?对于麦克风这种硬件设备,与其说是格式,我更觉得这是驱动程序。在linux上,通用的音频驱动程序,就是alsa。
这样的话,我们很容易形成了下面这样的命令:
ffmpeg -f alsa -i hw:0 out.wav
这里, -f 指定格式(驱动程序)为alsa, -i 指出文件路径,这里是麦克风地址“hw:0”,最后一个是输出文件路径,这里为当前路径下,保存为 out.wav文件。
我们在终端运行这条命令之后,然后对着麦克风讲话“”,然后按q结束录音,就可以看到当前路径下面,生成了 out.wav。然后我们使用
ffplay out.wav
播放这段录音,就可以听到刚刚我们喊的“”。
FFmpeg拉取服务端的视频流
Windows下编译FFmpeg详解_ffmpegwindows编译_zhouyongku的博客-CSDN博客
FFmpeg 详尽编译过程_ffmpeg如何编译_学术袁的博客-CSDN博客
ffplay Documentation
用 VS2019 编译带 libx264, libmp3lame 的 FFmpeg 库_ffmpeg libmp3lame 编译_fly4free的博客-CSDN博客
FFmpeg简介_贝勒里恩的博客-CSDN博客
ubuntu18.04编译FFMPEG_ubuntu18.04下编译ffmpeg_papaofdoudou的博客-CSDN博客
Linux下交叉编译FFMPEG与X264库:目标板友善之臂Tiny4412开发板_EXYNOS4412(ARMV7_32位)-腾讯云开发者社区-腾讯云 交叉编译多平台 FFmpeg 库并提取视频帧 - 知乎
FFmpeg进行笔记本摄像头+麦克风实现流媒体直播服务,展示在浏览器上。_ffmpeg打开麦克风_jrongweb的博客-CSDN博客
EasyDarwin+FFmpeg实现本地音视频推流_ffmpeg单独音频推流_屠龍之技的博客-CSDN博客
树莓派利用ffmpeg将外接USB麦克风的音频实时推流到rtmp服务器,实现在任意设备上实时监听音频 - 芒果爱吃胡萝卜
读取麦克风的核心代码及详解_FFmpeg4.3开发系列之10:采集麦克风AAC+MP3编码存储并直播实战_C/C++视频-51CTO学堂
linux下使用ffmpeg采集音频数据_ffmpeg捕捉麦克风 linux_snail_hunan的博客-CSDN博客
ffmpeg精简_ffmpeg 精简_且行且探索的博客-CSDN博客
ffmpeg精简_wanxiu.的博客-CSDN博客
嵌入式开发(四):海思Hi3559AV100交叉编译ffmpeg_夜风里唱的博客-CSDN博客
LAME的交叉编译 - 知乎
ffmpeg交叉编译_平平无奇的小垃圾的博客-CSDN博客
Linux下交叉编译FFMPEG与X264库:目标板友善之臂Tiny4412开发板_EXYNOS4412(ARMV7_32位)-腾讯云开发者社区-腾讯云
嵌入式平台Portaudio的交叉编译_portaudio lib库_遇逆境处之泰然的博客-CSDN博客
PortAudio - an Open-Source Cross-Platform Audio API
libsndfile 用法简介_liyuanbhu的博客-CSDN博客
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(一) 嵌入式Linux开发基本概念以及开发流程介绍-阿里云开发者社区
正点原子imx6ull开发板视频监控项目实战系列5: 摄像头(V4L2)和声卡(ALSA)接口简介_imx6ull 摄像头_One Piece&的博客-CSDN博客
Linux---ALSA音频工具arecord、aplay、amixer使用_linux aplay_面朝大海0902的博客-CSDN博客正点原子imx6ull开发板视频监控项目实战系列5: 摄像头(V4L2)和声卡(ALSA)接口简介_imx6ull 摄像头_One Piece&的博客-CSDN博客 Linux驱动开发|音频驱动_51CTO博客_android驱动开发和linux驱动开发
正点原子Linux第五章 I.MX6U-ALPHA开发平台介绍 - 知乎
正点原子ALPHA开发板核心资源分析_正点原子阿尔法开发板怎么样_ManGo CHEN的博客-CSDN博客 正点原子linux阿尔法开发板使用—Linux设备树_配置linux开发板设备树_梅山剑客的博客-CSDN博客
正点原子linux阿尔法开发板使用——IIC驱动_梅山剑客的博客-CSDN博客
Linux 4G 通信实验_嵌入式学习者。的博客-CSDN博客
正点原子Linux第七十一章Linux 4G通信实验 - 知乎
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/4639.html