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博客
Linux 4G 通信实验_嵌入式学习者。的博客-CSDN博客