ffmpeg常用命令总结

一些global参数,各种功能都可以用
-ss 8 就是从第8秒开始读取文件进行后续操作
-t 10 就是截取10秒的数据
-vn :disable video
-an: disable audio
一.转码和转封装:

  1. ffmpeg -i ingput.rmvb -vcodec mpeg4 -b:v 200k -r 15 -s 640x480 -an -f mp4 -movflags faststart -y output.mp4
    -vcodec : 强制指定视频编码格式,-acodec 强制指定音频编码格式 (ffmpeg -codecs可以查看支持的codecs, 如果指定copy则就不转码,直接copy原来的stream到新文件)
    -b:v 指定视频的码率,b:a 指定音频码率 -b 指定视频和音频加起来的码率。
    -r : frame rate 帧率
    -an : disable audio 这样output.mp4里面没有音频。
    -f force format,指定文件格式(ffmpeg -formats可以列举支持的format)
    -movflags faststart : 如果不指定faststart, 则ffmpeg默认会将moov box放在mdat box的后面,如果加上这个flag,moov box会放在前面。
    -s :分辨率,还可以利用-vf scale=iw*0.9:ih*0.9来实现缩放,vf就是指定video filter,这里利用scale filter来实现。注意这两种方法设置分辨率都是scale,不是crop,所以如果不是等比例scale,会造成图像变形。
    -y : 覆盖输出文件,就是如果output.mp4文件已经存在,则不提示,直接覆盖,-n是不覆盖

2.生成dash mp4文件
ffmpeg -i input.flv -c copy -f mp4 -movflags dash output.mp4
关于movflags的选项,可以通过ffmpeg -h muxer=mp4查看
3.生成hls文件P96
生成实时的直播流:
ffmpeg -re -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -start_number 300 -hls_time 10 output.m3u8
-re :就是根据文件真实的帧率来读取文件,生成实时刷新的直播流,而不是一下子按照电脑的最大性能把文件一下子读进去。
-bsf:v h264_mp4toannexb :就是把mp4格式的nalu转换为annexb格式的P97有解释,对265来说为hevc_mp4toannexb
-start_number :生成ts文件的名称编号的开始数字
-hls_time : 文件切片长度。更多参数可以参考P96
-c 和-codec后面都跟codec name,就是指定codec

4.生成segment切片P105
segment切片比hls要灵活一些,因为hls只支持ts文件,segment可以切为mp4,ts,flv等各种文件格式,并且也可以生成像m3u8这种文件list。参数可以参考ffmpeg -h muxer=segment
ffmpeg -re -i input.mp4 -c copy -f segment -segment_format mp4 test_output-%d.mp4

转码:
ffmpeg -i input.mp4 -c:v libx264 -g 50 -sc_threshold 0 -t 60 output.mp4
-g : gop 长度
-src_threshold : 这里等于0是为了场景切换时不自动插入I帧。如果只是设置-g,则碰到场景切换时,会自动插入I帧,所以不是严格的50帧为一个gop。P126
ffmpeg -i video_1920.mp4 -vf scale=640:360 video_640.mp4
-vf是调用video filter,这里用了scale filter来改变分辨率进行转码。
ffmpeg -i input.mp3 -acodec libmp3lame -b:a 64k output.mp3 使用libmp3lame库来转码mp3
ffmpeg -i input.wav -c:a aac -q:a 2 output.aac -q:a参数可以分不同等级,对应不同码率P142

生成fmp4:
ffmpeg -i xx.mp4 -vcodec copy -acodec copy -f mp4 -movflags frag_keyframe+empty_moov output.mp4

多媒体直播点播流的操作:
1.从rtsp服务器拉取直播流,存储为本地文件:
ffmpeg -rtsp_transport tcp -i rtsp://10.0.0.2/stream0 -c copy -f mp4 output.mp4 (这里实测只有video,拉不到audio,这里后面还要debug一下)
2.拉取http server的直播点播流
ffmpeg -i http://bbs.chinaffmpeg.com/live.m3u8 -c copy -f mp4 output.mp4
ffmpeg -i http://bbs.chinaffmpeg.com/live.ts -c copy -f mp4 output.mp4
一次转码,输出多路:
1.利用系统的管道:(注意“-”的使用)
ffmpeg -i input.mp4 -acodec aac -vcodec libx264 -f flv - | ffmpeg -f flv -i - -c copy -f flv out1.flv -c copy -f mp4 out2.mp4 -c copy -f flv rtmp://publish.chinaffmpeg.com/live/stream1
2.利用tee协议:
ffmpeg -re -i input.mp4 -vcodec libx264 -acodec aac -map 0 -f tee "[f=flv]rtmp://publish.chinaffmpeg .com/live/stream1 | [f=flv]rtmp://publish.chinaffmpeg.com/live/stream2”

dash流的生成
ffmpeg -re -i input.mp4 -c:v copy -acodec copy -f dash -window_size 4 index.mpd P180

二:音视频文件的抽取:
1.ffmpeg -i intput.mp4 -vn -acodec copy output.aac 抽取aac音频流
-vn :disable video
-an: disable audio
2.ffmpeg -i input.mp4 -vcodec copy -an -bsf h264_mp4toannexb output.h264 抽取h264视频流
3.ffmpeg -i input.mp4 -vcodec copy -an -bsf hevc_mp4toannexb -f hevc output.hevc 抽取h265视频流,并且将nalu的格式转换为annexb格式。(P114)
-bsf后面接bit stream filter, 支持的filter可以看ffmpeg -bsfs来查看,这里就是利用了 hevc_mp4toannexb这个filter来实现格式的转换。

三:filter滤镜的使用
命令格式为:[输入流或标记名] 滤镜参数 [临时标记名];[输入流或标记名] 滤镜参数 [临时标记名] …
例子1:将一个图片logo作为overlay打在一段视频上,
a.使用filter_complex
ffmpeg -i input.mp4 -i logo.png -filter_complex "[1:v]scale=176:144[logo];[0:v][logo]overlay=x=0:y=0" output.mp4
b.使用-vf vf就是video filter
ffmpeg -i input.mp4 -vf "movie=log.png[wn]; [in][wn]overlay=30:10[out]" output.mp4
上面这两个命令就解释了filter_complex和vf (filter_simple)的区别,当有多个输入时,使用filter_complex,比如a中就是两个-i输入。b中只有一个输入-i,就使用-vf,这两个命令都实现相同的功能,但是filter的组合方式不一样。(暂时可以这么理解)

1.文字水印 利用drawtext filter (如果显示汉字,需要用的字体库支持汉字,本机支持的字库可以使用fc-list命令来查看)
ffmpeg -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:x=20:y=20" output.mp4
2.时间水印:enable的作用是每3秒显示一次,如果要一直显示,去掉enable选项。
ffmpeg -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='%{localtime\:%Y-%m-%d %H-%M-%S}’:fontcolor=green:box=1:boxcolor=yellow:enable=lt(mod(t\,3)\,1)" output.mp4 (这里注意转义字符,:和,都需要转义,因为ffmpeg中,和:都是分隔符,是有特殊意义的,所以某些命令中需要的这些符号,都需要转义,告诉ffmpeg这不是ffmpeg的分隔符。比如这里的:就是localtime命令里面的,所以就需要转移,后面的逗号也是一样)
3.图片水印:movie 滤镜
ffmpeg -i input.mp4 -vf "movie=logo.png[wm];[in][wm]overlay=30:10[out]" output.mp4
半透明水印:
有些水印图片是有背景色的,比如很多logo图片是白底的,这时overlay到视频上会非常突兀,可以利用colorkey来做成半透明效果,colorkey有三个参数(ffmpeg -h filter=colorkey) :color,similarity, blend. color是指定要透明的颜色,similarity指定相似度,blend指定叠加的参数。下面的例子logo图片是白色底的,我们这里color就设置为white(也可以设置颜色色值,比如黑色就是全0x0000,也可以写black),similarity设置相似度,因为我们要把白色去掉,可以设置的小一些0.2,blend设置为0.5
ffmpeg -i input.mp4 -vf "movie=logo.png, colorkey=white:0.2:0.5 [wm]; [in][wm] overlay=30:10 [out]" output.mp4
4.画中画:
ffmpeg -re -i input.mp4 -vf "movie=sub.mp4,scale=480x320[test]; [in][test] overlay=x=main_w-480:y=main_h-320 [out]" -vcodec libx264 output.flv
5跑马灯,就是子视频从左向右游动
ffmpeg -re -i input.mp4 -vf "movie=sub.mp4,scale=480x320[test]; [in][test] overlay=x='if(gte(t,2), -w+(t-2)*20,NAN)':y=0 [out]" -vcodec libx264 output.mp4
6.九宫格 shortest参数是overlay的参数,表明终止最短的视频时全部终止
ffmpeg -re -i input1.mp4 -re -i input2.mp4 -re -i input3.mp4 -re -i input4.mp4 -filter_complex "nullsrc=size=640x480 [base]; [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft];[1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright];[2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft];[3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3];[tmp3][lowerright] overlay=shortest=1:x=320:y=240" -c:v libx264 output.mp4
7.将字幕写入视频流 ass滤镜,这个滤镜是将字幕overlay到视频流上。
ffmpeg -i input.mp4 -vf ass=t1.ass -f mp4 output.mp4
8.将字幕流封装到文件中
ffmpeg -i input.mp4 -i t1.ass -acodec copy -vcodec copy -scodec copy output.mkv
如果input.mp4中已经有了字幕,想用t1.ass来替换原有的字幕,需要用map来指定(map n:m n指第几个输入,m指该输入的第几个流,从0开始计数。如-map 0:1 就是第0个输入的第1个流。)
ffmpeg -i input.mp4 -i t1.ass -map 0:0 -map 0:1 -map 1:0 -acodec copy -vcodec copy -scodec copy output.mkv

9.绿幕视频抠图(影视中的绿幕)
ffmpeg -i input.mp4 -i input_green.mp4 -filter_complex "[1:v]chromakey=Green:0.1:0.2[ckout];[0:v][ckout] overlay[out]" -map "[out]" output.mp4

10.获取视频截图
ffmpeg -i input.mp4 -ss 00:00:7.435 -vframes 1 out.png
定时获取截图
ffmpeg -i input.mp4 -vf fps=1 img%d.jpeg 一秒钟一张截图
ffmpeg -i input.mp4 -vf fps=1/60 img%03d.jpg 这样就是一分钟获取一帧截图

11音视频的倍速播放 atempo(音频)与setpts(视频)两个滤镜
atempo滤镜有一个参数tempo 范围为从0.5到2
ffmpeg -i input.wav -filter_complex "atempo=tempo=0.5" -acodec aac output.aac
setpts对视频倍速
ffmpeg -re -i input.mp4 -filter_complex "setpts=PTS*2" output.mp4 (半速)

12可以用ffserver + ffmpeg来搭建rtsp服务器
参考:https://blog.csdn.net/FPGATOM/article/details/98782202
ffserver是ffmpeg自带的一个程序,可以提供多种协议的server服务,通过配置文件ffserver.conf来配置不同的协议(这个文件默认路径为/etc/ffserver.conf,如果没有,在ffmpeg源码里面有,可以copy出来,ffserver -f ./ffserver来运行自己配置的配置文件)。但注意ffserver只提供协议层,不提供数据,所以需要ffmpeg来向ffserver feed数据。比如下面这个简单例子:
配置文件:

HTTPPort 8090
RTSPPort 5454
 HTTPBindAddress 0.0.0.0
 MaxHTTPConnections 2000
 MaxClients 1000
 MaxBandwidth 1000
 CustomLog -
<Feed feed1.ffm>
 File /tmp/feed1.ffm
 FileMaxSize 5M
 ACL allow 127.0.0.1
 </Feed>

# RTSP examples
# You can access this stream with the RTSP URL:
#   rtsp://localhost:5454/test1-rtsp.mpg
#
# A non-standard RTSP redirector is also created. Its URL is:
<Stream live.h264>
Format rtp
Feed feed1.ffm
VideoCodec libx264
VideoFrameRate 25
VideoBitRate 100
VideoSize 1920x1080
#AVPresetVideo default
#AVPresetVideo baseline
AVOptionVideo flags +global_header
NoAudio   #如果有audio, ffplay不能播放,还不知道为啥
#
#AudioCodec aac
#AudioBitRate 53
#AudioChannels 1
#AudioSampleRate 32000
#AVOptionAudio flags +global_header
</Stream>

# Server status
<Stream stat.html>
Format status 
# Only allow local people to get the status
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
 
#FaviconURL http://pond1.gladstonefamily.net:8080/favicon.ico
</Stream> 
# Redirect index.html to the appropriate site 
<Redirect index.html>
URL http://www.ffmpeg.org/
</Redirect>     

按照上面配置好之后,就可以运行ffserver了,ffserver -f ./ffserver.conf 就可以运行起来了
然后在另一个终端中用ffmpeg 给它feed video 流:
ffmpeg -re -i ./output.mp4 -vcodec copy http://localhost:8090/feed1.ffm

然后在另一个终端用ffplay就可以拉取rtsp流了,
ffplay -i rtsp://127.0.0.1:5454/live.h264   注意这里要使用127.0.0.1, 用localhost不行,可能是配置文件里面的配置有点问题,还没有细揪。
另外,还可以通过浏览器来查看ffserver的status, http://localhost:8090/stat.html可以看到现在存在的流

三:linux上录制屏幕
ffmpeg -f x11grab -framerate 25 -video_size 800x600 -i :0.0+300,200 output.mp4 就可以录制起始位置为(300,200), 大小为800x600的屏幕
录制音视频
ffmpeg -f alsa -i pulse -f x11grab -r 30 -s 1920x1080 -i :0.0 -acodec aac -ac 1 -ar 44100 -qscale 0.01 -vcodec libx264 -preset ultrafast -crf 0 output1.mp4

二. 帮助信息的查看
ffmpeg -h muxer=mp4 查看mp4 muxer的参数支持
ffmpeg -h encoder=h264

ffprobe命令,用来查看多媒体信息
1.ffprobe -v quiet -show_packets -select_streams v test_output-0.mp4 2> x|grep pts_time | tail -n 3
查看文件视频流的pts, tail是查看尾部3个,要查看头部三个,用head -n 3

<think>好的,我现在需要帮助用户解决如何使用FFmpeg录制音频的问题。首先,用户已经提供了一些相关的引用内容,我需要仔细查看这些引用,找出与录制音频相关的命令和说明。 首先,引用[1]中有一个命令示例:`ffmpeg -f dshow -i audio="virtual-audio-capturer" output.aac`,这看起来是使用DirectShow设备录制音频的命令,指定了音频输入源为“virtual-audio-capturer”,输出为AAC格式的文件。这里可能需要解释一下各个参数的作用,比如`-f dshow`表示使用DirectShow捕获设备,`-i audio="..."`指定具体的音频设备名称。 然后,引用[3]提到使用FFmpeg录制本地麦克风的音频并通过UDP推流,虽然用户的问题是关于录制到文件,但这里可以确认FFmpeg支持不同的音频输入源,比如麦克风。可能需要说明如何选择不同的音频设备,比如在Windows下使用dshow,在Linux下使用alsa或pulse等。 引用[4]是关于录屏的命令,但其中可能涉及视频和音频的混合录制,不过用户现在只需要音频,所以可能需要忽略视频部分,专注于音频参数。 用户可能需要基础的命令结构,以及如何调整参数,比如格式、编码器、采样率等。同时,用户可能想知道如何列出可用的音频设备,这在不同的操作系统下方法不同,比如Windows的`dshow`,Linux的`alsa`或`pulse`,macOS的`avfoundation`。 另外,引用[2]提到合并视频和音频,但用户的问题不涉及合并,所以可能暂时不需要这部分。但需要注意,如果用户后续有需求,可以提及相关命令。 现在需要整理出一个基本的录制音频的命令格式,并解释每个参数的意义。例如,基本的命令可能包括输入设备的选择、编码器的选择、输出格式等。同时,可能需要给出不同操作系统下的示例,比如Windows、Linux、macOS。 还需要注意,用户可能需要知道如何查看可用的音频设备,例如在Windows下使用`ffmpeg -list_devices true -f dshow -i dummy`,在Linux下使用`arecord -l`或`pactl list sources`,在macOS下使用`ffmpeg -f avfoundation -list_devices true -i ""`。 另外,关于输出格式,用户可能希望选择不同的音频格式,比如WAV(无损)、MP3、AAC等,需要给出相应的编码器参数,比如`-c:a libmp3lame`用于MP3,`-c:a aac`用于AAC。 还要考虑采样率、比特率等参数,例如`-ar 44100`设置采样率,`-b:a 192k`设置比特率。这些参数可以根据用户的需求进行调整,以平衡音质和文件大小。 可能还需要提醒用户常见的错误,比如设备名称不正确,权限问题,或者编码器未安装等。例如,如果使用某些编码器需要FFmpeg编译时支持,可能需要用户安装额外的库。 最后,根据用户提供的示例,可能需要补充更多实际案例,比如录制麦克风输入、系统声音,或者同时录制麦克风和系统音频(如果系统支持)。 总结下来,回答的结构应该是: 1. 基本命令格式,解释参数含义。 2. 不同操作系统下的设备列表查看方法。 3. 不同输出格式的示例(WAV、MP3、AAC)。 4. 可选参数(采样率、比特率等)。 5. 注意事项和常见问题。 确保所有命令使用正确的格式,行内公式用$...$,独立公式用$$...$$,但这里可能更多是代码块,所以需要用代码块包裹命令示例。同时,生成相关问题,比如如何选择设备、如何处理音质问题、如何同时录制多个设备等。 最后,检查引用,确保正确标注来源,比如引用[1]和引用[3]中的命令示例。</think>### 如何使用 FFmpeg 录制音频? #### 1. 基本命令格式 FFmpeg 录制音频的核心命令结构为: ```bash ffmpeg -f <输入设备格式> -i <音频设备名称> [可选参数] 输出文件 ``` - `-f`:指定输入设备格式(如 Windows 的 `dshow`,Linux 的 `alsa` 或 `pulse`,macOS 的 `avfoundation`)。 - `-i`:指定音频输入设备名称(需根据系统查询)。 - 输出文件格式由文件名后缀决定(如 `.wav`、`.mp3`、`.aac`)。 #### 2. 查看可用音频设备 不同操作系统的查询方式: - **Windows**: ```bash ffmpeg -list_devices true -f dshow -i dummy ``` 输出中会列出 `DirectShow audio devices` 的名称,例如 `audio="麦克风 (Realtek Audio)"`[^1]。 - **Linux**: ```bash arecord -l # 列出ALSA设备 pactl list sources # 列出PulseAudio设备 ``` - **macOS**: ```bash ffmpeg -f avfoundation -list_devices true -i "" ``` #### 3. 录制示例 - **Windows 录制麦克风(保存为 AAC)**: ```bash ffmpeg -f dshow -i audio="麦克风 (Realtek Audio)" -c:a aac output.aac ``` 其中 `audio="麦克风 (Realtek Audio)"` 需替换为实际设备名称[^1]。 - **Linux 录制系统声音(保存为 MP3)**: ```bash ffmpeg -f pulse -i default -c:a libmp3lame output.mp3 ``` - **macOS 录制麦克风(保存为 WAV)**: ```bash ffmpeg -f avfoundation -i ":0" -c:a pcm_s16le output.wav ``` #### 4. 可选参数 - **指定采样率**:`-ar 44100`(默认 44.1kHz)。 - **设置比特率**:`-b:a 192k`(MP3/AAC 常用)。 - **限制时长**:`-t 60`(录制 60 秒后停止)。 - **静音检测**:`-af silencedetect=noise=-30dB:d=2`(检测静默部分)。 #### 5. 注意事项 - 若提示编码器不支持,需安装 FFmpeg 完整版(如 `libmp3lame` 或 `aac` 编码器)。 - 权限问题:Linux/macOS 可能需要 `sudo` 或授权麦克风访问。 - 高质量录制建议使用无损格式(如 WAV),后期再转码压缩。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值