FFmpeg介绍
当下直播应用很火,在音视频领域,FFmpeg相当知名。可能你用的一些视频播放器背后都有它的身影。FFmpeg是一个开源的跨平台多媒体处理工具,可以用于处理音视频流、转码、封装、解封装等操作,且支持多种格式和协议。它的视频采集功能也非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,且支持直播应用。
常见用途
1. 转码:将一种格式的音视频文件转换为另一种格式,例如将MP4文件转换为AVI文件,或将H.264编码的视频转换为VP9编码的视频等。(解码,音视频播放器内核)
2. 剪辑:从一个音视频文件中截取出一段或多段内容,例如将一个长视频剪辑成多个短视频,或将一段音频剪辑出来作为铃声等。
3. 抓取:从摄像头或屏幕等设备中抓取音视频流,例如将摄像头的视频流抓取下来进行录制或直播等。(音视频采集)
4. 处理:对音视频流进行处理,例如添加水印、字幕、特效等,或进行降噪、去抖动、降低码率等处理。
5. 分离和合并:将一个音视频文件中的音频和视频分离出来,或将多个音视频文件合并成一个文件。(格式转换)
6. 直播:将音视频流实时推送到服务器上,或从服务器上拉取音视频流进行实时播放。
举例:在Linux平台上,ffmpeg对V4L2的视频设备提供了很好的支持。如:
./ffmpeg -t 10 -f video4linux2 -s 176*144 -r 8 -i /dev/video0 -vcodec h263 -f rtp rtp://192.168.1.105:5060 > /tmp/ffmpeg.sdp
以上命令表示:采集10秒钟视频,对video4linux2视频设备进行采集,采集QCIF(176*144)的视频,每秒8帧,视频设备为/dev/video0,视频编码为H263,输出格式为RTP,后面定义了IP地址及端口,将该码流所对应的SDP文件重定向到/tmp/ffmpeg.sdp中,将此SDP文件上传到流媒体服务器(如live555)就可以实现直播了。
FFmpeg提供了libavformat库,其中包含了RTSP协议的实现,可以直接使用该库来拉取RTSP流。在使用FFmpeg拉取RTSP流时,可以使用类似如下的命令:
ffmpeg -i rtsp://xxx.xxx.xxx.xxx/xxx -c copy output.mp4
其中, rtsp://xxx.xxx.xxx.xxx/xxx 是RTSP流的URL地址, -c copy
表示直接复制流数据,不进行编解码, output.mp4
是输出文件名。除了命令行方式,FFmpeg还提供了API接口,可以在程序中使用该接口来拉取RTSP流。
总之,FFmpeg是一个功能强大的多媒体处理工具,可以用于处理各种音视频文件,提供了丰富的功能和API,可以满足各种多媒体处理需求。
下载地址
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目录,并使用以下命令编译: ./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:
通过 git 克隆一份
git clone http://git.videolan.org/git/x264.git
以下使用的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下不建议禁用汇编优化。若是嵌入式平台移植需要,则需要禁用汇编。
编译过程
配置参数
#!/bin/sh
../ffmpeg-4.4/configure \
--prefix=`pwd`/../ffmpegbuild \
--target-os=linux
--arch=x86_64
--enable-gpl \
--enable-version3 \
--disable-stripping \
--disable-asm \
--enable-shared \
--enable-libmp3lame \
--extra-cflags="-I`pwd`/../lamebuild/include" \
--extra-ldflags="-LIBPATH:`pwd`/../lamebuild/lib" \
--enable-libx264 \
--extra-cflags="-I`pwd`/../x264build/include" \
--extra-ldflags="-LIBPATH:`pwd`/../x264build/lib"
make -j6 && make install && echo OOOOOOOOKKKKKKKKKKKKKK!!!!!!!!!!
注:--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-linux下编译
在x64平台西编译很简单,安装两个依赖库:
sudo apt-get install libx264-dev
sudo apt-get install libmp3lame-dev
执行configure配置:
root@hecs-287347:~/test/ffmpeg/ffmpeg-4.4.4$ ./configure --prefix=../ffmpegbuild --enable-shared --enable-libmp3lame --enable-libx264 --enable-gpl --disable-asm --enable-version3
如果要支持alsa声卡设备,还需要安装依赖:sudo apt-get install libasound-dev
并增加配置选项:--enable-alsa:开启ALSA音频驱动程序支持;
如果要想生成ffplay,需要SDL2库的支持。sudo apt-get install libsdl2-dev
日志:
root@hecs-287347:~/test/ffmpeg/ffmpeg-4.4.4#
root@hecs-287347:~/test/ffmpeg/ffmpeg-4.4.4# ./configure --prefix=../ffmpegbuild --enable-shared --enable-libmp3lame --e nable-libx264 --enable-gpl --disable-asm --enable-version3
install prefix ../ffmpegbuild
source path .
C compiler gcc
C library glibc
ARCH c (generic)
big-endian no
runtime cpu detection yes
debug symbols yes
strip symbols yes
optimize for size no
optimizations yes
static yes
shared yes
postprocessing support yes
network support yes
threading support pthreads
safe bitstream reader yes
texi2html enabled no
perl enabled yes
pod2man enabled yes
makeinfo enabled no
makeinfo supports HTML no
External libraries:
iconv libmp3lame libx264 zlib
External libraries providing hardware acceleration:
v4l2_m2m
Libraries:
avcodec avfilter avutil swresample
avdevice avformat postproc swscale
Programs:
ffmpeg ffprobe
Enabled decoders:
aac bitpacked huffyuv pcm_f32le subrip
aac_fixed bmp hymt pcm_f64be subviewer
aac_latm bmv_audio iac pcm_f64le subviewer1
aasc bmv_video idcin pcm_lxf sunrast
ac3 brender_pix idf pcm_mulaw svq1
ac3_fixed c93 iff_ilbm pcm_s16be svq3
acelp_kelvin cavs ilbc pcm_s16be_planar tak
adpcm_4xm ccaption imc pcm_s16le targa
adpcm_adx cdgraphics imm4 pcm_s16le_planar targa_y216
adpcm_afc cdtoons imm5 pcm_s24be tdsc
adpcm_agm cdxl indeo2 pcm_s24daud text
adpcm_aica cfhd indeo3 pcm_s24le theora
adpcm_argo cinepak indeo4 pcm_s24le_planar thp
adpcm_ct clearvideo indeo5 pcm_s32be tiertexseqvideo
adpcm_dtk cljr interplay_acm pcm_s32le tiff
adpcm_ea cllc interplay_dpcm pcm_s32le_planar tmv
adpcm_ea_maxis_xa comfortnoise interplay_video pcm_s64be truehd
adpcm_ea_r1 cook ipu pcm_s64le truemotion1
adpcm_ea_r2 cpia jacosub pcm_s8 truemotion2
adpcm_ea_r3 cri jpeg2000 pcm_s8_planar truemotion2rt
adpcm_ea_xas cscd jpegls pcm_sga truespeech
adpcm_g722 cyuv jv pcm_u16be tscc
adpcm_g726 dca kgv1 pcm_u16le tscc2
adpcm_g726le dds kmvc pcm_u24be tta
adpcm_ima_alp derf_dpcm lagarith pcm_u24le twinvq
adpcm_ima_amv dfa loco pcm_u32be txd
adpcm_ima_apc dirac lscr pcm_u32le ulti
adpcm_ima_apm dnxhd m101 pcm_u8 utvideo
adpcm_ima_cunning dolby_e mace3 pcm_vidc v210
adpcm_ima_dat4 dpx mace6 pcx v210x
adpcm_ima_dk3 dsd_lsbf magicyuv pfm v308
adpcm_ima_dk4 dsd_lsbf_planar mdec pgm v408
adpcm_ima_ea_eacs dsd_msbf metasound pgmyuv v410
adpcm_ima_ea_sead dsd_msbf_planar microdvd pgssub vb
adpcm_ima_iss dsicinaudio mimic pgx vble
adpcm_ima_moflex dsicinvideo mjpeg photocd vc1
adpcm_ima_mtf dss_sp mjpegb pictor vc1_v4l2m2m
adpcm_ima_oki dst mlp pixlet vc1image
adpcm_ima_qt dvaudio mmvideo pjs vcr1
adpcm_ima_rad dvbsub mobiclip png vmdaudio
adpcm_ima_smjpeg dvdsub motionpixels ppm vmdvideo
adpcm_ima_ssi dvvideo movtext prores vmnc
adpcm_ima_wav dxa mp1 prosumer vorbis
adpcm_ima_ws dxtory mp1float psd vp3
adpcm_ms dxv mp2 ptx vp4
adpcm_mtaf eac3 mp2float qcelp vp5
adpcm_psx eacmv mp3 qdm2 vp6
adpcm_sbpro_2 eamad mp3adu qdmc vp6a
adpcm_sbpro_3 eatgq mp3adufloat qdraw vp6f
adpcm_sbpro_4 eatgv mp3float qpeg vp7
adpcm_swf eatqi mp3on4 qtrle vp8
adpcm_thp eightbps mp3on4float r10k vp8_v4l2m2m
adpcm_thp_le eightsvx_exp mpc7 r210 vp9
adpcm_vima eightsvx_fib mpc8 ra_144 vp9_v4l2m2m
adpcm_xa escape124 mpeg1_v4l2m2m ra_288 vplayer
adpcm_yamaha escape130 mpeg1video ralf vqa
adpcm_zork evrc mpeg2_v4l2m2m rasc wavpack
agm exr mpeg2video rawvideo wcmv
aic fastaudio mpeg4 realtext webp
alac ffv1 mpeg4_v4l2m2m rl2 webvtt
alias_pix ffvhuff mpegvideo roq wmalossless
als ffwavesynth mpl2 roq_dpcm wmapro
amrnb fic msa1 rpza wmav1
amrwb fits mscc rscc wmav2
amv flac msmpeg4v1 rv10 wmavoice
anm flashsv msmpeg4v2 rv20 wmv1
ansi flashsv2 msmpeg4v3 rv30 wmv2
ape flic msp2 rv40 wmv3
apng flv msrle s302m wmv3image
aptx fmvc mss1 sami wnv1
aptx_hd fourxm mss2 sanm wrapped_avframe
arbc fraps msvideo1 sbc ws_snd1
argo frwu mszh scpr xan_dpcm
ass g2m mts2 screenpresso xan_wc3
asv1 g723_1 mv30 sdx2_dpcm xan_wc4
asv2 g729 mvc1 sga xbin
atrac1 gdv mvc2 sgi xbm
atrac3 gif mvdv sgirle xface
atrac3al gremlin_dpcm mvha sheervideo xl
atrac3p gsm mwsc shorten xma1
atrac3pal gsm_ms mxpeg simbiosis_imx xma2
atrac9 h261 nellymoser sipr xpm
aura h263 notchlc siren xsub
aura2 h263_v4l2m2m nuv smackaud xwd
av1 h263i on2avc smacker y41p
avrn h263p opus smc ylc
avrp h264 paf_audio smvjpeg yop
avs h264_v4l2m2m paf_video snow yuv4
avui hap pam sol_dpcm zero12v
ayuv hca pbm sonic zerocodec
bethsoftvid hcom pcm_alaw sp5x zlib
bfi hevc pcm_bluray speedhq zmbv
bink hevc_v4l2m2m pcm_dvd srgc
binkaudio_dct hnm4_video pcm_f16le srt
binkaudio_rdft hq_hqa pcm_f24le ssa
bintext hqx pcm_f32be stl
Enabled encoders:
a64multi comfortnoise mp2 pcm_u16be ssa
a64multi5 dca mp2fixed pcm_u16le subrip
aac dnxhd mpeg1video pcm_u24be sunrast
ac3 dpx mpeg2video pcm_u24le svq1
ac3_fixed dvbsub mpeg4 pcm_u32be targa
adpcm_adx dvdsub mpeg4_v4l2m2m pcm_u32le text
adpcm_argo dvvideo msmpeg4v2 pcm_u8 tiff
adpcm_g722 eac3 msmpeg4v3 pcm_vidc truehd
adpcm_g726 exr msvideo1 pcx tta
adpcm_g726le ffv1 nellymoser pfm ttml
adpcm_ima_alp ffvhuff opus pgm utvideo
adpcm_ima_amv fits pam pgmyuv v210
adpcm_ima_apm flac pbm png v308
adpcm_ima_qt flashsv pcm_alaw ppm v408
adpcm_ima_ssi flashsv2 pcm_dvd prores v410
adpcm_ima_wav flv pcm_f32be prores_aw vc2
adpcm_ms g723_1 pcm_f32le prores_ks vorbis
adpcm_swf gif pcm_f64be qtrle vp8_v4l2m2m
adpcm_yamaha h261 pcm_f64le r10k wavpack
alac h263 pcm_mulaw r210 webvtt
alias_pix h263_v4l2m2m pcm_s16be ra_144 wmav1
amv h263p pcm_s16be_planar rawvideo wmav2
apng h264_v4l2m2m pcm_s16le roq wmv1
aptx hevc_v4l2m2m pcm_s16le_planar roq_dpcm wmv2
aptx_hd huffyuv pcm_s24be rpza wrapped_avframe
ass jpeg2000 pcm_s24daud rv10 xbm
asv1 jpegls pcm_s24le rv20 xface
asv2 libmp3lame pcm_s24le_planar s302m xsub
avrp libx264 pcm_s32be sbc xwd
avui libx264rgb pcm_s32le sgi y41p
ayuv ljpeg pcm_s32le_planar snow yuv4
bmp magicyuv pcm_s64be sonic zlib
cfhd mjpeg pcm_s64le sonic_ls zmbv
cinepak mlp pcm_s8 speedhq
cljr movtext pcm_s8_planar srt
Enabled hwaccels:
Enabled parsers:
aac dca g729 mpeg4video vc1
aac_latm dirac gif mpegaudio vorbis
ac3 dnxhd gsm mpegvideo vp3
adx dolby_e h261 opus vp8
av1 dpx h263 png vp9
avs2 dvaudio h264 pnm webp
avs3 dvbsub hevc rv30 xbm
bmp dvd_nav ipu rv40 xma
cavsvideo dvdsub jpeg2000 sbc
cook flac mjpeg sipr
cri g723_1 mlp tak
Enabled demuxers:
aa dirac image_pgm_pipe mtv segafilm
aac dnxhd image_pgmyuv_pipe musx ser
aax dsf image_pgx_pipe mv sga
ac3 dsicin image_photocd_pipe mvi shorten
ace dss image_pictor_pipe mxf siff
acm dts image_png_pipe mxg simbiosis_imx
act dtshd image_ppm_pipe nc sln
adf dv image_psd_pipe nistsphere smacker
adp dvbsub image_qdraw_pipe nsp smjpeg
ads dvbtxt image_sgi_pipe nsv smush
adx dxa image_sunrast_pipe nut sol
aea ea image_svg_pipe nuv sox
afc ea_cdata image_tiff_pipe obu spdif
aiff eac3 image_webp_pipe ogg srt
aix epaf image_xbm_pipe oma stl
alp ffmetadata image_xpm_pipe paf str
amr filmstrip image_xwd_pipe pcm_alaw subviewer
amrnb fits ingenient pcm_f32be subviewer1
amrwb flac ipmovie pcm_f32le sup
anm flic ipu pcm_f64be svag
apc flv ircam pcm_f64le svs
ape fourxm iss pcm_mulaw swf
apm frm iv8 pcm_s16be tak
apng fsb ivf pcm_s16le tedcaptions
aptx fwse ivr pcm_s24be thp
aptx_hd g722 jacosub pcm_s24le threedostr
aqtitle g723_1 jv pcm_s32be tiertexseq
argo_asf g726 kux pcm_s32le tmv
argo_brp g726le kvag pcm_s8 truehd
asf g729 live_flv pcm_u16be tta
asf_o gdv lmlm4 pcm_u16le tty
ass genh loas pcm_u24be txd
ast gif lrc pcm_u24le ty
au gsm luodat pcm_u32be v210
av1 gxf lvf pcm_u32le v210x
avi h261 lxf pcm_u8 vag
avr h263 m4v pcm_vidc vc1
avs h264 matroska pjs vc1t
avs2 hca mca pmp vividas
avs3 hcom mcc pp_bnk vivo
bethsoftvid hevc mgsts pva vmd
bfi hls microdvd pvf vobsub
bfstm hnm mjpeg qcp voc
bink ico mjpeg_2000 r3d vpk
binka idcin mlp rawvideo vplayer
bintext idf mlv realtext vqf
bit iff mm redspark w64
bmv ifv mmf rl2 wav
boa ilbc mods rm wc3
brstm image2 moflex roq webm_dash_manifest
c93 image2_alias_pix mov rpl webvtt
caf image2_brender_pix mp3 rsd wsaud
cavsvideo image2pipe mpc rso wsd
cdg image_bmp_pipe mpc8 rtp wsvqa
cdxl image_cri_pipe mpegps rtsp wtv
cine image_dds_pipe mpegts s337m wv
codec2 image_dpx_pipe mpegtsraw sami wve
codec2raw image_exr_pipe mpegvideo sap xa
concat image_gif_pipe mpjpeg sbc xbin
data image_j2k_pipe mpl2 sbg xmv
daud image_jpeg_pipe mpsub scc xvag
dcstr image_jpegls_pipe msf sdp xwma
derf image_pam_pipe msnwc_tcp sdr2 yop
dfa image_pbm_pipe msp sds yuv4mpegpipe
dhav image_pcx_pipe mtaf sdx
Enabled muxers:
a64 eac3 jacosub oma segafilm
ac3 f4v kvag opus segment
adts ffmetadata latm pcm_alaw singlejpeg
adx fifo lrc pcm_f32be smjpeg
aiff fifo_test m4v pcm_f32le smoothstreaming
alp filmstrip matroska pcm_f64be sox
amr fits matroska_audio pcm_f64le spdif
amv flac md5 pcm_mulaw spx
apm flv microdvd pcm_s16be srt
apng framecrc mjpeg pcm_s16le stream_segment
aptx framehash mkvtimestamp_v2 pcm_s24be streamhash
aptx_hd framemd5 mlp pcm_s24le sup
argo_asf g722 mmf pcm_s32be swf
asf g723_1 mov pcm_s32le tee
asf_stream g726 mp2 pcm_s8 tg2
ass g726le mp3 pcm_u16be tgp
ast gif mp4 pcm_u16le truehd
au gsm mpeg1system pcm_u24be tta
avi gxf mpeg1vcd pcm_u24le ttml
avm2 h261 mpeg1video pcm_u32be uncodedframecrc
avs2 h263 mpeg2dvd pcm_u32le vc1
bit h264 mpeg2svcd pcm_u8 vc1t
caf hash mpeg2video pcm_vidc voc
cavsvideo hds mpeg2vob psp w64
codec2 hevc mpegts rawvideo wav
codec2raw hls mpjpeg rm webm
crc ico mxf roq webm_chunk
dash ilbc mxf_d10 rso webm_dash_manifest
data image2 mxf_opatom rtp webp
daud image2pipe null rtp_mpegts webvtt
dirac ipod nut rtsp wtv
dnxhd ircam oga sap wv
dts ismv ogg sbc yuv4mpegpipe
dv ivf ogv scc
Enabled protocols:
async file icecast rtmp tee
cache ftp md5 rtmpt udp
concat gopher mmsh rtp udplite
crypto hls mmst srtp unix
data http pipe subfile
ffrtmphttp httpproxy prompeg tcp
Enabled filters:
abench avectorscope epx mcdeint showwaves
abitscope avgblur eq mcompand showwavespic
acompressor axcorrelate equalizer median shuffleframes
acontrast bandpass erosion mergeplanes shufflepixels
acopy bandreject estdif mestimate shuffleplanes
acrossfade bass exposure metadata sidechaincompress
acrossover bbox extractplanes midequalizer sidechaingate
acrusher bench extrastereo minterpolate sidedata
acue bilateral fade mix sierpinski
addroi biquad fftdnoiz monochrome signalstats
adeclick bitplanenoise fftfilt movie signature
adeclip blackdetect field mpdecimate silencedetect
adelay blackframe fieldhint mptestsrc silenceremove
adenorm blend fieldmatch msad sinc
aderivative bm3d fieldorder negate sine
adrawgraph boxblur fifo nlmeans smartblur
aecho bwdif fillborders nnedi smptebars
aemphasis cas find_rect noformat smptehdbars
aeval cellauto firequalizer noise sobel
aevalsrc channelmap flanger normalize spectrumsynth
aexciter channelsplit floodfill null speechnorm
afade chorus format nullsink split
afftdn chromahold fps nullsrc spp
afftfilt chromakey framepack oscilloscope sr
afifo chromanr framerate overlay ssim
afir chromashift framestep owdenoise stereo3d
afirsrc ciescope freezedetect pad stereotools
aformat codecview freezeframes pal100bars stereowiden
afreqshift color fspp pal75bars streamselect
agate colorbalance gblur palettegen super2xsai
agraphmonitor colorchannelmixer geq paletteuse superequalizer
ahistogram colorcontrast gradfun pan surround
aiir colorcorrect gradients perms swaprect
aintegral colorhold graphmonitor perspective swapuv
ainterleave colorize greyedge phase tblend
alimiter colorkey haas photosensitivity telecine
allpass colorlevels haldclut pixdesctest testsrc
allrgb colormatrix haldclutsrc pixscope testsrc2
allyuv colorspace hdcd pp thistogram
aloop colortemperature headphone pp7 threshold
alphaextract compand hflip premultiply thumbnail
alphamerge compensationdelay highpass prewitt tile
amerge concat highshelf pseudocolor tinterlace
ametadata convolution hilbert psnr tlut2
amix convolve histeq pullup tmedian
amovie copy histogram qp tmidequalizer
amplify cover_rect hqdn3d random tmix
amultiply crop hqx readeia608 tonemap
anequalizer cropdetect hstack readvitc tpad
anlmdn crossfeed hue realtime transpose
anlms crystalizer hwdownload remap treble
anoisesrc cue hwmap removegrain tremolo
anull curves hwupload removelogo trim
anullsink datascope hysteresis repeatfields unpremultiply
anullsrc dblur identity replaygain unsharp
apad dcshift idet reverse untile
aperms dctdnoiz il rgbashift uspp
aphasemeter deband inflate rgbtestsrc v360
aphaser deblock interlace roberts vaguedenoiser
aphaseshift decimate interleave rotate vectorscope
apulsator deconvolve join sab vflip
arealtime dedot kerndeint scale vfrdet
aresample deesser kirsch scale2ref vibrance
areverse deflate lagfun scdet vibrato
arnndn deflicker lenscorrection scroll vif
aselect dejudder life select vignette
asendcmd delogo limiter selectivecolor vmafmotion
asetnsamples derain loop sendcmd volume
asetpts deshake loudnorm separatefields volumedetect
asetrate despill lowpass setdar vstack
asettb detelecine lowshelf setfield w3fdif
ashowinfo dilation lumakey setparams waveform
asidedata displace lut setpts weave
asoftclip dnn_processing lut1d setrange xbr
asplit doubleweave lut2 setsar xfade
astats drawbox lut3d settb xmedian
astreamselect drawgraph lutrgb shear xstack
asubboost drawgrid lutyuv showcqt yadif
asubcut drmeter mandelbrot showfreqs yaepblur
asupercut dynaudnorm maskedclamp showinfo yuvtestsrc
asuperpass earwax maskedmax showpalette zoompan
asuperstop ebur128 maskedmerge showspatial
atadenoise edgedetect maskedmin showspectrum
atempo elbg maskedthreshold showspectrumpic
atrim entropy maskfun showvolume
Enabled bsfs:
aac_adtstoasc extract_extradata imx_dump_header null truehd_core
av1_frame_merge filter_units mjpeg2jpeg opus_metadata vp9_metadata
av1_frame_split h264_metadata mjpega_dump_header pcm_rechunk vp9_raw_reorder
av1_metadata h264_mp4toannexb mov2textsub prores_metadata vp9_superframe
chomp h264_redundant_pps mp3_header_decompress remove_extradata vp9_superframe_split
dca_core hapqa_extract mpeg2_metadata setts
dump_extradata hevc_metadata mpeg4_unpack_bframes text2movsub
eac3_core hevc_mp4toannexb noise trace_headers
Enabled indevs:
fbdev lavfi oss v4l2
Enabled outdevs:
fbdev oss v4l2
License: GPL version 3 or later
WARNING: pkg-config not found, library detection may fail.
WARNING: using libx264 without pkg-config
arm-linux下的交叉编译
交叉编译工具链,环境变量配置:
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
root@hecs-287347:/opt/arm/gcctools/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin# export PATH=$PATH:$(pwd)
LAME库的交叉编译
在sourceforge下载最新版本,我下载的版本是3.100。
./configure --host=arm-linux-gnueabihf --prefix=$(pwd)../lamebuild cc=arm-fsl-linux-gnueabi-gcc --disable-frontend
你以为这就正常了吗?注意这个有个坑啊,指定的cc=无效,指定的--host才是交叉工具链的前缀。我的工具链是arm-fsl-linux-gnueabi-gcc,所以--host需要改为如下:
./configure --host=arm-fsl-linux-gnueabi --prefix=/root/test/ffmpeg/lamebuild cc=arm-fsl-linux-gnueabi-gcc --disable-frontend
x264库交叉编译
下载地址:x264, the best H.264/AVC encoder - VideoLAN
./configure --prefix=../x264build --disable-asm --enable-shared --enable-static --host=arm-linux-gnueabi --cross-prefix=arm-fsl-linux-gnueabi-
ffmpeg交叉编译
./configure --prefix=../arm-ffmpegbuild --enable-shared --enable-libmp3lame --enable-libx264 --enable-gpl --disable-asm --enable-version3 --cross-prefix=arm-fsl-linux-gnueabi- --target-os=linux --extra-cflags="-I ../lamebuild/include" --extra-ldflags="-L ../lamebuild/lib" --enable-cross-compile --enable-small --arch=arm --cpu=arm926ej-s --disable-everything --enable-decoder=h264 --enable-parser=h264 --enable-demuxer=rtsp --extra-ldflags="-L/root/test/ffmpeg/x264build/lib" --extra-cflags="-I ../x264build/include"
测试验证
实战分享
FFmpeg —— 录制本地麦克风音频进行UDP推流,并进行拉流音频播放
使用ffmpeg命令采集音频
使用ffmpeg来采集音频,我们首先需要知道,如何访问麦克风,这个其实我们可以像访问文件一样,访问麦克风。文件的话,我们一般给出一个文件路径,就可以访问了,比如“/home/test/a.mp4”,同理,我们的麦克风的地址是“hw:0”。
其次,我们需要知道,麦克风这个文件格式是什么?对于麦克风这种硬件设备,与其说是格式,我更觉得这是驱动程序。在linux上,通用的音频驱动程序,就是alsa。
这样的话,我们很容易形成了下面这样的命令:
ffmpeg -f alsa -i hw:0 out.wav
这里, -f 指定格式(驱动程序)为alsa, -i 指出文件路径,这里是麦克风地址“hw:0”,最后一个是输出文件路径,这里为当前路径下,保存为 out.wav文件。
我们在终端运行这条命令之后,然后对着麦克风讲话“123456”,然后按q结束录音,就可以看到当前路径下面,生成了 out.wav。然后我们使用
ffplay out.wav
播放这段录音,就可以听到刚刚我们喊的“123456”。
FFmpeg拉取服务端的视频流
./ffmpeg -i rtsp://127.0.0.1/test.264 -c copy output.mp4
其他资源
Windows下编译FFmpeg详解_ffmpegwindows编译_zhouyongku的博客-CSDN博客
FFmpeg 详尽编译过程_ffmpeg如何编译_学术袁的博客-CSDN博客
用 VS2019 编译带 libx264, libmp3lame 的 FFmpeg 库_ffmpeg libmp3lame 编译_fly4free的博客-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博客
嵌入式开发(四):海思Hi3559AV100交叉编译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博客