|
| 1 | +FFmpeg常用命令行 |
| 2 | +=== |
| 3 | +### ffmpeg |
| 4 | + |
| 5 | +1.分离视频音频流 |
| 6 | + |
| 7 | +ffmpeg -i input_file -vcodec copy -an output_file_video //分离视频流 |
| 8 | +ffmpeg -i input_file -acodec copy -vn output_file_audio //分离音频流 |
| 9 | + |
| 10 | +2.视频解复用 |
| 11 | + |
| 12 | +ffmpeg –i test.mp4 –vcodec copy –an –f m4v test.264 |
| 13 | +ffmpeg –i test.avi –vcodec copy –an –f m4v test.264 |
| 14 | + |
| 15 | +3.视频转码 |
| 16 | + |
| 17 | +ffmpeg –i test.mp4 –vcodec h264 –s 352*278 –an –f m4v test.264 //转码为码流原始文件 |
| 18 | +ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an –f m4v test.264 //转码为码流原始文件 |
| 19 | +ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi //转码为封装文件 |
| 20 | +//-bf B帧数目控制,-g 关键帧间隔控制,-s 分辨率控制 |
| 21 | + |
| 22 | +4.视频封装 |
| 23 | + |
| 24 | +ffmpeg –i video_file –i audio_file –vcodec copy –acodec copy output_file |
| 25 | + |
| 26 | +5.视频剪切 |
| 27 | + |
| 28 | +ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg //提取图片 |
| 29 | +ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi //剪切视频 |
| 30 | +//-r 提取图像的频率,-ss 开始时间,-t 持续时间 |
| 31 | + |
| 32 | +6.视频录制 |
| 33 | + |
| 34 | +ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec copy out.avi |
| 35 | + |
| 36 | +7.YUV序列播放 |
| 37 | + |
| 38 | +ffplay -f rawvideo -video_size 1920x1080 input.yuv |
| 39 | + |
| 40 | +8.YUV序列转AVI |
| 41 | + |
| 42 | +ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi |
| 43 | + |
| 44 | +常用参数说明: |
| 45 | + |
| 46 | +主要参数: -i 设定输入流 -f 设定输出格式 -ss 开始时间 视频参数: -b 设定视频流量,默认为200Kbit/s -r 设定帧速率,默认为25 -s 设定画面的宽与高 -aspect 设定画面的比例 -vn 不处理视频 -vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器 音频参数: -ar 设定采样率 -ac 设定声音的Channel数 -acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器 -an 不处理音频 |
| 47 | + |
| 48 | +------------------------------------------------------------------------ |
| 49 | + |
| 50 | +---------------------------------------------------------------------------------------------------------- |
| 51 | + |
| 52 | +------------------------------------------------------------------------ |
| 53 | + |
| 54 | +0.压缩转码mp4文件 |
| 55 | + |
| 56 | +ffmpeg -i input.avi -s 640x480 output.avi |
| 57 | + |
| 58 | +ffmpeg -i input.avi -s vga output.avi |
| 59 | + |
| 60 | + |
| 61 | + |
| 62 | +1、将文件当做直播送至live |
| 63 | + |
| 64 | +ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName |
| 65 | + |
| 66 | +2、将直播媒体保存至本地文件 |
| 67 | + |
| 68 | + |
| 69 | + |
| 70 | +ffmpeg -i rtmp://server/live/streamName -c copy dump.flv |
| 71 | + |
| 72 | +3、将其中一个直播流,视频改用h264压缩,音频不变,送至另外一个直播服务流 |
| 73 | + |
| 74 | + |
| 75 | + |
| 76 | +ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v libx264 -vpre slow -f flv rtmp://server/live/h264Stream |
| 77 | + |
| 78 | + |
| 79 | + |
| 80 | +4、将其中一个直播流,视频改用h264压缩,音频改用faac压缩,送至另外一个直播服务流 |
| 81 | + |
| 82 | +ffmpeg -i rtmp://server/live/originalStream -c:a libfaac -ar 44100 -ab 48k -c:v libx264 -vpre slow -vpre baseline -f flv rtmp://server/live/h264Stream |
| 83 | + |
| 84 | +5、将其中一个直播流,视频不变,音频改用faac压缩,送至另外一个直播服务流 |
| 85 | + |
| 86 | +ffmpeg -i rtmp://server/live/originalStream -acodec libfaac -ar 44100 -ab 48k -vcodec copy -f flv rtmp://server/live/h264_AAC_Stream |
| 87 | + |
| 88 | +6、将一个高清流,复制为几个不同视频清晰度的流重新发布,其中音频不变 |
| 89 | + |
| 90 | +ffmpeg -re -i rtmp://server/live/high_FMLE_stream -acodec copy -vcodec x264lib -s 640×360 -b 500k -vpre medium -vpre baseline rtmp://server/live/baseline_500k -acodec copy -vcodec x264lib -s 480×272 -b 300k -vpre medium -vpre baseline rtmp://server/live/baseline_300k -acodec copy -vcodec x264lib -s 320×200 -b 150k -vpre medium -vpre baseline rtmp://server/live/baseline_150k -acodec libfaac -vn -ab 48k rtmp://server/live/audio_only_AAC_48k |
| 91 | + |
| 92 | +7、功能一样,只是采用-x264opts选项 |
| 93 | + |
| 94 | +ffmpeg -re -i rtmp://server/live/high_FMLE_stream -c:a copy -c:v x264lib -s 640×360 -x264opts bitrate=500:profile=baseline:preset=slow rtmp://server/live/baseline_500k -c:a copy -c:v x264lib -s 480×272 -x264opts bitrate=300:profile=baseline:preset=slow rtmp://server/live/baseline_300k -c:a copy -c:v x264lib -s 320×200 -x264opts bitrate=150:profile=baseline:preset=slow rtmp://server/live/baseline_150k -c:a libfaac -vn -b:a 48k rtmp://server/live/audio_only_AAC_48k |
| 95 | + |
| 96 | +8、将当前摄像头及音频通过DSSHOW采集,视频h264、音频faac压缩后发布 |
| 97 | + |
| 98 | +ffmpeg -r 25 -f dshow -s 640×480 -i video=”video source name”:audio=”audio source name” -vcodec libx264 -b 600k -vpre slow -acodec libfaac -ab 128k -f flv rtmp://server/application/stream_name |
| 99 | + |
| 100 | +9、将一个JPG图片经过h264压缩循环输出为mp4视频 |
| 101 | + |
| 102 | +ffmpeg.exe -i INPUT.jpg -an -vcodec libx264 -coder 1 -flags +loop -cmp +chroma -subq 10 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -flags2 +dct8x8 -trellis 2 -partitions +parti8x8+parti4x4 -crf 24 -threads 0 -r 25 -g 25 -y OUTPUT.mp4 |
| 103 | + |
| 104 | +10、将普通流视频改用h264压缩,音频不变,送至高清流服务(新版本FMS live=1) |
| 105 | + |
| 106 | +ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v libx264 -vpre slow -f flv “rtmp://server/live/h264Stream live=1〃 |
| 107 | + |
| 108 | + |
| 109 | +------------------------------------------------------------------------ |
| 110 | + |
| 111 | +---------------------------------------------------------------------------------------------------------- |
| 112 | + |
| 113 | +------------------------------------------------------------------------ |
| 114 | + |
| 115 | + |
| 116 | + |
| 117 | +1.采集usb摄像头视频命令: |
| 118 | + |
| 119 | +ffmpeg -t 20 -f vfwcap -i 0 -r 8 -f mp4 cap1111.mp4 |
| 120 | + |
| 121 | + |
| 122 | + |
| 123 | +./ffmpeg -t 10 -f vfwcap -i 0 -r 8 -f mp4 cap.mp4 |
| 124 | + |
| 125 | +具体说明如下:我们采集10秒,采集设备为vfwcap类型设备,第0个vfwcap采集设备(如果系统有多个vfw的视频采集设备,可以通过-i num来选择),每秒8帧,输出方式为文件,格式为mp4。 |
| 126 | + |
| 127 | + |
| 128 | + |
| 129 | +2.最简单的抓屏: |
| 130 | + |
| 131 | +ffmpeg -f gdigrab -i desktop out.mpg |
| 132 | + |
| 133 | + |
| 134 | + |
| 135 | +3.从屏幕的(10,20)点处开始,抓取640x480的屏幕,设定帧率为5 : |
| 136 | + |
| 137 | +ffmpeg -f gdigrab -framerate 5 -offset_x 10 -offset_y 20 -video_size 640x480 -i desktop out.mpg |
| 138 | + |
| 139 | + |
| 140 | + |
| 141 | +4.ffmpeg从视频中生成gif图片: |
| 142 | + |
| 143 | +ffmpeg -i capx.mp4 -t 10 -s 320x240 -pix_fmt rgb24 jidu1.gif |
| 144 | + |
| 145 | + |
| 146 | +### ffplay |
| 147 | +ffplay是以FFmpeg框架未基础,外加渲染音视频的库libSDL构建的媒体文件播放器。 |
| 148 | + |
| 149 | +ffplay [选项] [输入文件] |
| 150 | + |
| 151 | +``` |
| 152 | +ffplay /Users/xxx/Desktop/111.mp4 |
| 153 | +ffplay http://219.151.31.38/liveplay-kk.rtxapp.com/live/program/live/hnwshd/4000000/mnf.m3u8 |
| 154 | +``` |
| 155 | +如果按s键就可以进入frame-step模式,即按s键一次就会播放下一帧图像。 |
| 156 | + |
| 157 | +##### 主要选项 |
| 158 | + |
| 159 | +- '-x width' 强制以 "width" 宽度显示 |
| 160 | +- '-y height' 强制以 "height" 高度显示 |
| 161 | +- '-an' 禁止音频 |
| 162 | +- '-vn' 禁止视频 |
| 163 | +- '-ss pos' 跳转到指定的位置(秒) |
| 164 | +- '-t duration' 播放 "duration" 秒音/视频 |
| 165 | +- '-bytes' 按字节跳转 |
| 166 | +- '-nodisp' 禁止图像显示(只输出音频) |
| 167 | +- '-f fmt' 强制使用 "fmt" 格式 |
| 168 | +- '-window_title title' 设置窗口标题(默认为输入文件名) |
| 169 | +- '-loop number' 循环播放 "number" 次(0将一直循环) |
| 170 | +- '-showmode mode' 设置显示模式 |
| 171 | + - 可选的 mode : |
| 172 | + - '0, video' 显示视频 |
| 173 | + - '1, waves' 显示音频波形 |
| 174 | + - '2, rdft' 显示音频频带 |
| 175 | + - 默认值为 'video',你可以在播放进行时,按 "w" 键在这几种模式间切换 |
| 176 | +- '-i input_file' 指定输入文件 |
| 177 | +- '-sync type' 设置主时钟为音频、视频、或者外部。默认为音频。主时钟用来进行音视频同步 |
| 178 | +- '-threads count' 设置线程个数 |
| 179 | +- '-autoexit' 播放完成后自动退出 |
| 180 | +- '-exitonkeydown' 任意键按下时退出 |
| 181 | +- '-exitonmousedown' 任意鼠标按键按下时退出 |
| 182 | +- '-acodec codec_name' 强制指定音频解码器为 "codec_name" |
| 183 | +- '-vcodec codec_name' 强制指定视频解码器为 "codec_name" |
| 184 | +- '-scodec codec_name' 强制指定字幕解码器为 "codec_name" |
| 185 | + |
| 186 | +如果希望从视频的第30秒开始播放,播放10秒钟的文件,则可以使用如下命令 |
| 187 | +`ffplay -ss 30 -t 10 /Users/xxx/Desktop/111.mp4` |
| 188 | + |
| 189 | +##### 音画同步 |
| 190 | + |
| 191 | +ffplay也是一个视频播放器,所以不得不提出来的一个问题是:音画同步。 |
| 192 | +ffplay的音画同步的实现方式其实有三种,分别是: |
| 193 | +- 以音频为主时间轴作为同步源 |
| 194 | +- 以视频为主时间轴作为同步源 |
| 195 | +- 以外部时钟为主时间轴作为同步源。 |
| 196 | + |
| 197 | +下面就以音频为主时间轴来作为同步源来作为案例进行讲解,而且ffplay默认也是以音频为基准进行对齐的,那么以音频作为对齐基准是如何实现的呢? |
| 198 | + |
| 199 | +首先需要说明的是,播放器接收到的视频帧或者音频帧,内部都是会有时间戳(PTS时钟)来标识它实际应该在什么时刻展示,实际的对齐策略如下: |
| 200 | + 比较视频当前的播放时间和音频当前的播放时间,如果视频播放过快,则通过加大延迟或者重复播放来降低视频播放速度,如果视频播放慢了,则通过减小延迟或者丢帧来追赶音频播放的时间点。 |
| 201 | + 关键就在于音视频时间的比较和延迟的计算,当前在比较的过程中会设置一个阈值,如果超过预设的阈值就应该作出调整(丢帧或者重复渲染),这就是整个对齐策略。 |
| 202 | + |
| 203 | +在使用ffplay的时候,我们可以明确的指定使用那种对齐方式,比如: |
| 204 | +`ffplay test.mp4 -sync audio` |
| 205 | +上面这个命令显式的指定了使用以音频为基准进行音视频同步的方式播放视频文件,当然这也是ffplay的默认播放设置。 |
| 206 | +`ffplay test.mp4 -sync video` |
| 207 | +上面这个命令显式的指定了使用以视频为基准进行音视频同步的方式播放视频文件。 |
| 208 | +`ffplay test.mp4 -sync ext` |
| 209 | +上面这个命令显式的指定了使用外部时钟为基准进行音视频同步的方式播放视频文件。 |
| 210 | + |
| 211 | + |
| 212 | +### ffprobe |
| 213 | +ffprobe是ffmpeg命令行中用来查看媒体文件格式的工具。 |
| 214 | + |
| 215 | +命令格式: |
| 216 | +`ffprobe [文件名]` |
| 217 | + |
| 218 | +``` |
| 219 | +ffprobe /Users/xxx/Desktop/111.mp4 |
| 220 | +
|
| 221 | +ffprobe version 4.4 Copyright (c) 2007-2021 the FFmpeg developers |
| 222 | + built with Apple clang version 12.0.5 (clang-1205.0.22.9) |
| 223 | + configuration: --prefix=/usr/local/Cellar/ffmpeg/4.4_2 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-avresample --enable-videotoolbox |
| 224 | + libavutil 56. 70.100 / 56. 70.100 |
| 225 | + libavcodec 58.134.100 / 58.134.100 |
| 226 | + libavformat 58. 76.100 / 58. 76.100 |
| 227 | + libavdevice 58. 13.100 / 58. 13.100 |
| 228 | + libavfilter 7.110.100 / 7.110.100 |
| 229 | + libavresample 4. 0. 0 / 4. 0. 0 |
| 230 | + libswscale 5. 9.100 / 5. 9.100 |
| 231 | + libswresample 3. 9.100 / 3. 9.100 |
| 232 | + libpostproc 55. 9.100 / 55. 9.100 |
| 233 | +Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/xuchuanren/Desktop/111.mp4': |
| 234 | + Metadata: |
| 235 | + major_brand : isom |
| 236 | + minor_version : 512 |
| 237 | + compatible_brands: isomiso2avc1mp41 |
| 238 | + encoder : Multimedia Cloud Transcode (cloud.baidu.com) |
| 239 | + comment : Content Adaptive Encoding 3.0 |
| 240 | + Duration: 00:00:41.52, start: 0.000000, bitrate: 163 kb/s // 视频的时长是41秒52毫秒,开始播放时间是0,,整个文件的比特率是163Kbit/s |
| 241 | + Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 91 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default) |
| 242 | + // 上面这一行的信息是,第一个流是视频流,编码格式是h264格式(封装格式是AVC1),每一帧的数据表示为yuv420p,分辨率为1280*720.这路流的比特率为91Kbit/s,帧率为每秒钟25帧 |
| 243 | + Metadata: |
| 244 | + handler_name : VideoHandler |
| 245 | + vendor_id : [0][0][0][0] |
| 246 | + Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 65 kb/s (default) |
| 247 | + // 上面这一行的信息是,第二个流为音频流,编码方式为ACC(封装格式为MP4A),并且采用的Profile是LC规格,采样率是44.1KHz,声道是立体声,这路流的比特率是65Kbit/s |
| 248 | + Metadata: |
| 249 | + handler_name : SoundHandler |
| 250 | + vendor_id : [0][0][0][0] |
| 251 | +``` |
| 252 | + |
| 253 | +查看流的格式信息 |
| 254 | +ffprobe -show_format -i /Users/xxx/Desktop/111.mp4 |
| 255 | + |
| 256 | +``` |
| 257 | +[FORMAT] |
| 258 | +filename=/Users/xxx/Desktop/111.mp4 |
| 259 | +nb_streams=2 |
| 260 | +nb_programs=0 |
| 261 | +format_name=mov,mp4,m4a,3gp,3g2,mj2 |
| 262 | +format_long_name=QuickTime / MOV |
| 263 | +start_time=0.000000 |
| 264 | +duration=41.518000 |
| 265 | +size=848895 |
| 266 | +bit_rate=163571 |
| 267 | +probe_score=100 |
| 268 | +TAG:major_brand=isom |
| 269 | +TAG:minor_version=512 |
| 270 | +TAG:compatible_brands=isomiso2avc1mp41 |
| 271 | +TAG:encoder=Multimedia Cloud Transcode (cloud.baidu.com) |
| 272 | +TAG:comment=Content Adaptive Encoding 3.0 |
| 273 | +[/FORMAT] |
| 274 | +``` |
| 275 | +查看每一帧信息 |
| 276 | +ffprobe -show_frames -i /Users/xxx/Desktop/111.mp4 |
| 277 | + |
| 278 | +查看包信息 |
| 279 | +ffprobe -show_packets -i /Users/xxx/Desktop/111.mp4 |
| 280 | + |
| 281 | + |
| 282 | + |
| 283 | +--- |
| 284 | + |
| 285 | +- 邮箱 :charon.chui@gmail.com |
| 286 | +- Good Luck! |
0 commit comments