FFmpeg是一款跨平台的开源音视频处理工具,可在命令行中使用,也可通过多种编程语言进行调用,如Python、Java等。
1 流协议
流协议
一种标准化的传递方法,用于分解视频为多个块,将其发送给视频播放器,播放器重新组合播放。
编解码器是指视频压缩技术,即使不需要使用流协议,视频也需要使用编解码器进行编码和解码。
RTMP (Real-Time Messaging Protocol)
WebSocket
流地址格式示例
一种双向通信协议,适合于实时数据传输。
HTTP-FLV
HLS (HTTP Live Streaming)
DASH (Dynamic Adaptive Streaming Over HTTP) / MPEG-DASH
WebRTC (Web Real-Time Communications)
一种现代实时通信协议,用于浏览器间的实时音视频通信,通常不使用URL来传输流。
适合实时视频聊天和会议应用,灵活性强,支持实时低延迟流,可能存在兼容性问题。
MSS (Microsoft Smooth Streaming)
HDS (HTTP Dynamic Streaming)
2 FFmpeg
FFmpeg
FFmpeg支持上述流媒体协议的处理和转换,可以用于流媒体的编码、解码、转码、推流和拉流等操作。
官网“https://ffmpeg.org ”下载,Windows安装时,需要将安装路径的bin目录设置到Path环境变量中。
提供的命令行工具
ffmpeg(音视频编解码器)是FFmpeg提供的核心命令行工具,输出快品质高文件小。
ffplay是以FFmpeg框架为基础,外加渲染音视频的库libSDL构建的媒体文件播放器。
ffprobe是FFmpeg命令行工具中相对简单的命令工具,用于查看媒体文件格式等信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 sudo apt update sudo add-apt -repository ppa:kirillshkrogalev/ffmpeg-next sudo apt-get install ffmpeg sudo yum install ffmpeg brew install ffmpeg ffmpeg -version ffmpeg -encoders ffmpeg configure -encoders ffmpeg configure -decoders ffmpeg configure -protocols ffmpeg configure --help
2-1 安装版本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ffmpeg -version ffmpeg version 6.0 -essentials_build-www .gyan.dev Copyright (c) 2000 -2023 the FFmpeg developers built with gcc 12.2 .0 (Rev10, Built by MSYS2 project) configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband libavutil 58 . 2.100 / 58 . 2.100 libavcodec 60 . 3.100 / 60 . 3.100 libavformat 60 . 3.100 / 60 . 3.100 libavdevice 60 . 1.100 / 60 . 1.100 libavfilter 9 . 3.100 / 9 . 3.100 libswscale 7 . 1.100 / 7 . 1.100 libswresample 4 . 10.100 / 4 . 10.100 libpostproc 57 . 1.100 / 57 . 1.100
2-2 文件播放 1 2 3 4 5 6 7 8 9 10 11 12 13 ffplay test.mp3 ffplay test.pcm -f s16le -ar 32000 -ac 2 ffplay test.mp4 ffplay test.mp4 -loop 10 ffplay test.mp4 -autoexit ffplay test.mp4 -x 320 -y 240 ffplay test.mp4 -window_title testplayer ffplay test.mp4 -sync audio ffplay test.mp4 -sync video ffplay test.mp4 -sync ext
2-3 媒体信息 1 2 3 4 5 6 7 8 9 10 11 ffprobe test.mp4 ffprobe test.mp4 -show_format ffprobe test.mp4 -show_frames ffprobe test.mp4 -show_frames -v error ffprobe test.mp4 -show_streams ffprobe test.mp4 -show_packets ffprobe test.mp4 -print_format json
(1) 查看信息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 ffprobe test.mp4 -v error -select_streams v:0 -count_frames -show_entries stream=nb_frames -of default=nokey=1 :noprint_wrappers=1 ffprobe test.mp4 -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1 :nokey=1 ffprobe test.mp4 -v error -select_streams v:0 -count_frames -show_entries stream=nb_read_frames -of default=nokey=1 :noprint_wrappers=1 -skip_frame nokey ffprobe test.mp4 -v error -select_streams v:0 -skip_frame nokey -show_entries frame=pkt_pts_time ffprobe test.mp4 -v error -select_streams v:0 -skip_frame nokey -show_entries frame=pkt_pts_time -of csv=p=0 ffprobe test.mp4 -v error -select_streams v:0 -skip_frame nokey -show_entries frame=pkt_pts_time -of csv=print_section=0 ffprobe -v error -select_streams v:0 -show_entries frame=pkt_pts_time -of csv test.mp4 ffprobe test.mp4 -v error -show_frames | find "pict_type" ffprobe test.mp4 -v error -show_frames | grep pict_type ffprobe test.mp4 -v error -select_streams v -show_frames -show_entries frame=pict_type -of csv | findstr /n "I" | for /f "tokens=1 delims=:" %a in ('findstr /n "I"' ) do @echo %a ffprobe test.mp4 -v error -select_streams v -show_frames -show_entries frame=pict_type -of csv | grep -n I | cut -d ':' -f 1 ffprobe -v error -select_streams v:0 -show_entries frame=pkt_pts_time,pict_type -of csv test.mp4
(2) 内容解析 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 ffprobe test.mp4 ... Input Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 creation_time : 2023 -04-17T08 :50 :27.000000 Z Hw : 1 : bitRate : 16000000 : maxrate : 16000000 : te_is_reencode : 1 : encoder : Lavf58.76.100 Duration: 00 :00 :31.88 , start : 0.000000 , bitrate: 11745 kb/s Stream Metadata: creation_time : 2023 -04-17T08 :50 :27.000000 Z handler_name : VideoHandler vendor_id : [0 ][0 ][0 ][0 ] Stream Metadata: creation_time : 2023 -04-17T08 :50 :27.000000 Z handler_name : SoundHandler vendor_id : [0 ][0 ][0 ][0 ]
2-4 参数说明 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 -i -y -t 60 -f mp4 -map 0 -map 0 :v -map 0 :a -map 0 :v:0 -map 0 :a:0 -map [v ] -map [a ] -re -ss 00 :01:30
(1) 视频参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 -s 320x240 -r 30 -b 200k -an -vn -vb 200k -c:v libx264 -vcodec libxvid -crf 23 -preset medium -aspect 16 :9
(2) 音频参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 -ab 128k -an -ar 8000 -ac 1 -aq 0 -c:a acc -acodec mp3
3 获取信息 1 2 3 4 5 6 7 8 9 10 11 ffmpeg -i test.mp4 -f null NULL ffmpeg -i http://220.161 .87.62 :8800 /hls/0 /index.m3u8 -f null NULL ffmpeg -i test.mp4 -f null /dev/null ffmpeg -i http://220.161 .87.62 :8800 /hls/0 /index.m3u8 -f null /dev/null
4 拼接合并
拼接合并
拼接
通常指的是将多个视频文件按顺序连接在一起,形成一个长视频。
在FFmpeg中,可以使用concat协议,或者filter来实现视频的拼接。
合并
指的是将多个视频文件合并成一个画中画或分屏的效果,也可以是将多个音频轨道合并成一个音频文件。
FFmpeg中可以使用filter实现视频合并,例如:overlay filter实现画中画效果,amix filter实现音频混合。
拼接更多指的是将视频按顺序连接在一起,而合并更多指的是将视频进行叠加或混合。
拼接或合并前【注意事项】
确保所有视频的参数匹配,包括分辨率、帧率、像素格式等,不匹配时需先使用滤镜对视频进行调整。
要求输入视频使用相同的编解码格式,如果不同,则需要重新编码视频,以确保编解码格式保持一致。
确保视频的时长和帧率匹配,以避免拼接或合并后出现播放速度不一致的问题。
不同的视频格式需使用不同的处理方式,确保输入视频的格式兼容并符合要求。
若视频中包含音频,需确保音频的参数匹配,并在拼接或合并时正确的处理音频。
在拼接或合并时,需要注意保持视频质量,避免出现画面失真或压缩损失等情况。
4-1 视频拼接 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ffmpeg -i test1.mp4 -qscale 4 test1.mpg ffmpeg -i test2.mp4 -qscale 4 test2.mpg ffmpeg -i "concat:test1.mpg|test2.mpg" -c :v mpeg4 output.mp4 ffmpeg -i test1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb test1.ts ffmpeg -i test2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb test2.ts ffmpeg -i "concat:test1.ts|test2.ts" -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4 ffmpeg -i test1.mp4 -i test2.mp4 -i test3.mp4 -filter_complex '[0:0][0:1] [1:0][1:1] [2:0][2:1] concat=n=3:v=1:a=1 [v][a]' -map [v ] -map [a ] output.mp4 ffmpeg -i test1.mp4 -i test2.mp4 -i test3.mp4 -i test4.mp4 -filter_complex '[0:0][1:0][2:0][3:0] concat=n=4:v=1 [v]' -map [v ] output.mp4
4-2 视频合并
视频合并
当两个视频合并时,各自的音频流处理方式可以分三种情况。
若两个视频的音频流相同,可选择保留其中一个视频的音频流,或将两个音频流混合在一起。
若两个视频的音频流不同,可选择保留其中一个视频的音频流,或将其中一视频的音频静音。
如果想保留两个视频的音频流,可以使用音频混合的方式将其合并,以保留两个视频的声音。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 ffmpeg -i test1.mp4 -i test2.mp4 -lavfi hstack hstack.mp4 ffmpeg -i test1.mp4 -i test2.mp4 -filter_complex hstack hstack.mp4 ffmpeg -i test1.mp4 -vn -y -acodec copy audio1.m4a ffmpeg -i test2.mp4 -vn -y -acodec copy audio2.m4a ffmpeg -i audio1.m4a -i audio2.m4a -filter_complex "[0:a][1:a]amix=inputs=2:duration=longest" audio3.mp3 ffmpeg -i hstack.mp4 -i audio3.mp3 -c :v copy -c :a aac -strict experimental output.mp4 ffmpeg -i test1.mp4 -i test2.mp4 -i test3.mp4 -lavfi hstack=inputs=3 output.mp4 ffmpeg -i test1.mp4 -i test2.mp4 -filter_complex "[0:v]pad=iw*2:ih*1[a];[a][1:v]overlay=w" output.mp4 ffmpeg -i test1.mp4 -i test2.mp4 -filter_complex "[0:v]pad=iw:ih*2[a];[a][1:v]overlay=0:h" output.mp4 ffmpeg -i test1.mp4 -i test2.mp4 -i test3.mp4 -filter_complex "[0:v]pad=iw*3:ih*1[a];[a][1:v]overlay=w[b];[b][2:v]overlay=2.0*w" output.mp4 ffmpeg -i test1.mp4 -i test2.mp4 -i test3.mp4 -filter_complex "[0:v]pad=iw:ih*3[a];[a][1:v]overlay=0:h[b];[b][2:v]overlay=0:2.0*h" output.mp4 ffmpeg -i test1.mp4 -i test2.mp4 -i test3.mp4 -i test4.mp4 -filter_complex "[0:v]pad=iw*2:ih*2[a]; [a][1:v]overlay=w[b];[b][2:v]overlay=0:h[c];[c][3:v]overlay=w:h" output.mp4
4-3 添加水印 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ffmpeg -i test.mp4 -vf "movie=test.jpg[logo];[in][logo]overlay=10:10:1[out]" output.mp4 ffmpeg -i test.mp4 -i test.jpg -filter_complex "[0:v][1:v]overlay=10:10:enable='between(t,0,5)'" output.mp4 ffmpeg -i test.mp4 -i test.jpg -filter_complex overlay output.mp4 ffmpeg -i test.mp4 -vf "movie=test.jpg[logo];[in][logo]overlay=10:10:1[out]" -acodec copy output.mp4 ffmpeg -i test.mp4 -ignore_loop 0 -i test.gif -filter_complex overlay=0 :H -h output.mp4 ffmpeg -i test.flv -vf "drawtext=fontfile=test.ttf:text='添加文字水印': x=100:y=10:fontsize=24:fontcolor=yellow:shadowy=2" output.mp4
5 画面旋转 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ffmpeg -i test.mp4 -metadata :s:v rotate="90" -codec copy output.mp4 ffmpeg -i test.mp4 -vf "transpose=1" output.mp4 ffmpeg -i test.mp4 -vf "transpose=2" output.mp4 ffmpeg -i test.mp4 -vf hflip output.mp4 ffmpeg -i test.mp4 -vf vflip output.mp4 ffmpeg -i test.mp4 -vf "transpose=3" output.mp4 ffmpeg -i test.mp4 -vf "transpose=0" output.mp4
6 视频转码
视频转码
转文件格式
通常指的是改变视频文件的容器格式,即改变视频数据的封装方式,但不会改变视频的编码方式。
可能影响视频兼容性和功能,但不改变视频的压缩算法,常见格式包括MP4、AVI、FLV、MKV等。
转编码格式
通常指改变视频文件的编码方式,即改变视频数据的压缩格式以及算法,而不改变视频的容器格式。
可能影响视频质量、大小和兼容性,但不改变文件类型,常见格式有H.264、H.265、MPEG-4等。
转编码格式主要关注视频数据的压缩和编码方式,而转文件格式主要关注视频数据的封装以及存储方式。
6-1 转文件格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ffmpeg -i test.3 gp -f avi -vcodec libxvid -acodec mp3 -ar 22050 output.avi ffmpeg -i test.mkv -vcodec copy -acodec copy -bsf :v h264_mp4toannexb output.avi ffmpeg -i test.h264 -c :v libx264 -c :a aac output.ts ffmpeg -i test.wmv -c :v flv -c :a libmp3lame output.flv ffmpeg -i test.avi -aspect 16 :9 -maxrate 2 M -bufsize 5 M output.mpeg ffmpeg -i test.mp3 -f s16le -acodec pcm_s16le -ar 44100 output.pcm ffmpeg -i test.mp3 -f s16le -acodec pcm_s16le -ar 44100 -hide_banner -loglevel error output.pcm ffmpeg -i test.mp3 output.wav ffmpeg -i test.mp3 -hide_banner -loglevel error output.wav
(1) flv转其他 1 2 3 4 5 6 7 8 9 10 11 12 13 ffmpeg -i test.flv -b :v 640 k output.mp4 ffmpeg -i test.flv -b :v 200 k -ac 2 -r 25 -vcodec h264 -acodec mp3 -b :a 128 k -ar 44100 output.mp4 ffmpeg -i test.flv -b :v 200 k -ac 1 -r 25 -vcodec h263 -acodec aac -b :a 128 k -ar 8000 -s 176 x144 output.3 gp
(2) 其他转3gp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ffmpeg -i test.mpeg -y -ar 22500 -r 15 -ac 2 -s 176 x144 -c :v h263 -b :v 128 k -c :a aac -b :a 24 k -f 3 gp output.3 gp ffmpeg -i test.wmv -y -ar 08000 -r 15 -ac 1 -s 176 x144 -ab 12200 -acodec libamr_nb -b :v 128 k output.3 gp ffmpeg -i test.avi -y -ar 08000 -r 25 -ac 1 -s 352 x288 -ab 32 k -vcodec h263 -acodec libopencore_amrnb -b :v 128 k output.3 gp
(3) mp4转其他 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ffmpeg -i test.mp4 output.avi ffmpeg -i test.mp4 -c copy output.mkv ffmpeg -i test.mp4 -b :v 640 k output.flv ffmpeg -i test.mp4 -c :v libx264 -ar 22050 -crf 28 output.flv ffmpeg -i test.mp4 -acodec copy -vcodec copy -f flv output.flv ffmpeg -i test.mp4 -c :v copy -c :a copy output.ts ffmpeg -i test.mp4 -c :v wmv2 -b :v 1024 k -c :a wmav2 -b :a 192 k output.wmv ffmpeg -i test.mp4 -c :v libx264 -c :a aac -crf 23 -preset medium -b :v 1 M output.h264 ffmpeg -i test.mp4 -s 176 x144 -vcodec h263 -r 25 -b :v 12200 -ab 12200 -ac 1 -ar 8000 output.3 gp ffmpeg -i test.mp4 -c :v mpeg2video -c :a mp2 -q :v 2 output.mpg[mpeg ] ffmpeg -i test.mp4 -c :v mpeg2video -c :a mp2 -q :v 2 -maxrate 4000 k -bufsize 1835 k output.mpg
(4) 其他转mp4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 ffmpeg -i test.avi -c copy -map 0 output.mp4 ffmpeg -i test.h264 -c :v libx264 -crf 23 -preset medium -vf "setpts=PTS-STARTPTS" output.mp4 ffmpeg -i test.mkv -y -vcodec copy -acodec copy output.mp4 ffmpeg -i test.wmv -c :v libx264 -crf 23 -c :a aac output.mp4 ffmpeg -i test.ts -f mp4 -vcodec copy -acodec copy output.mp4 ffmpeg -i test.ts -f mp4 -vcodec copy -acodec copy -loglevel quiet output.mp4 ffmpeg -i http://220.161 .87.62 :8800 /hls/0 /index.m3u8 -c copy -bsf :a aac_adtstoasc -movflags +faststart output.mp4
6-2 转编码格式 1 2 3 4 5 6 7 8 ffmpeg -i test.mp4 -vcodec h264 output.mp4 ffmpeg -i test.mp4 -vcodec mpeg4 output.mp4 ffmpeg -i test.mp4 -c :v libx265 -c :a aac output.mp4
7 图像处理
图像处理
FFmpeg截取视频帧的两种seeking方式。
在输入文件之前使用-ss参数:影响视频解码的速度,因为FFmpeg会在指定时间点之前进行解码。
在输入文件之后使用-ss参数:会在解码后丢弃指定时间点之前的帧,可能导致一些性能上的差异。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ffmpeg -ss 00 :01 :05 -i test.mp4 -frames :v 1 output.jpg ffmpeg -i test.mp4 -ss 00 :00 :05 -frames :v 1 output.jpg ffmpeg -i test.mp4 -y -f image2 -ss 8 -t 0.001 -s 350 x240 output.jpg ffmpeg -i test.avi -r 1 -f image2 image-%3 d.jpeg ffmpeg -i test.avi -r 1 -f image2 -pix_fmt yuvj420p image-%3 d.jpeg ffmpeg -i test.avi -r 1 -f image2 -sws_flags neighbor image-%3 d.jpeg ffmpeg -i test.mp4 -vf "fps=10,scale=320:-1:flags=lanczos" -t 3 output.gif
7-1 图转视频 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ffmpeg -i test%d.jpg -vf "scale=500:424" -c :v libx264 output.mp4 ffmpeg -framerate 30 -i test%d.jpg -c :v libx264 -r 30 -b :v 200 k -pix_fmt yuv420p output.mp4 ffmpeg -framerate 30 -i test%d.jpg -c :v libx264 -r 30 -b :v 200 k -pix_fmt yuv420p -t 00 :00 :05 output.mp4 ffmpeg -framerate 25 -pattern_type glob -i "*.jpg" -c :v libx264 -r 30 -pix_fmt yuv420p output.mp4 ffmpeg -framerate 10 -pattern_type glob -i "*.jpg" output.mp4cat *.jpg | ffmpeg -f image2pipe -i - output.mp4
7-2 格式转换 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ffmpeg -i test.jpg output.png ffmpeg -i test.jpg -pix_fmt yuv420p output.webp ffmpeg -i test.png -pix_fmt yuvj420p output.jpg ffmpeg -i test.png output.bmp ffmpeg -i test.png -pix_fmt yuv420p output.webp ffmpeg -i test.png output.tiff ffmpeg -i test.png -vcodec png -vcodec rawvideo -f rawvideo -pix_fmt rgb24 output.raw ffmpeg -i test.webp -pix_fmt yuvj420p output.jpg ffmpeg -i test.webp output.png
8 其他操作 1 2 3 4 5 6 7 8 9 10 11 12 13 ffmpeg -i test.wav -i test.avi output.mpg ffmpeg -i test.wav -i test.avi -map 0 :a:0 -map 1 :v:0 -maxrate 3.5 M -bufsize 4 M output.mpg ffmpeg -i test.mp4 -aspect 16 :9 output.mp4 ffmpeg -i test.mp4 -vcodec libx264 -x264-params keyint=1 :scenecut=0 -acodec copy output.mp4
8-1 视频压缩 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ffmpeg -i test.mp4 -vcodec h264 output.mp4 ffmpeg -i test.mp4 -b :v 1000 k -b :a 128 k output.mp4 ffmpeg -i test.mp4 -vcodec h264 -vf scale=640 :-2 -threads 4 output.mp4 ffmpeg -i test.mp4 -vcodec libx264 -crf 28 -acodec aac output.mp4 ffmpeg -i test.flv -vcodec libx264 -crf 28 -acodec aac output.flv ffmpeg -i test.avi -vcodec libx264 -crf 28 -acodec aac output.avi ffmpeg -i test.wmv -vcodec libx264 -crf 28 -acodec aac output.wmv ffmpeg -i test.3 gp -vcodec libx264 -crf 28 -acodec aac output.3 gp ffmpeg -i test.mpeg -vcodec libx264 -crf 28 -acodec aac output.mpeg ffmpeg -i test.mpeg -vcodec libx264 -crf 28 -acodec aac -b :v 5000 k -bufsize 10000 k output.mpeg ffmpeg -i test.mpeg -vcodec libx264 -crf 28 -acodec aac -b :v 5000 k -bufsize 10000 k -maxrate 5000 k output.mpeg
8-2 视频剪切 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ffmpeg -i test.mp4 -ss 3 -t 5 -codec copy output.mp4 ffmpeg -i test.avi -ss 00 :00 :03 -t 00 :00 :05 -vcodec copy -acodec copy output.avi ffmpeg -i test.mp4 -ss 00 :00 :05 -to 00 :00 :10 -c :v copy -c :a copy output.mp4 ffmpeg -i test.flv -ss 00 :00 :05 -to 00 :00 :10 -c :v copy -c :a copy output.flv ffmpeg -i test.avi -ss 00 :00 :05 -to 00 :00 :10 -c :v copy -c :a copy output.avi ffmpeg -i test.wmv -ss 00 :00 :05 -to 00 :00 :10 -c :v copy -c :a copy output.wmv ffmpeg -i test.3 gp -ss 00 :00 :05 -to 00 :00 :10 -c :v copy -c :a copy output.3 gp ffmpeg -i test.mpeg -ss 00 :00 :05 -to 00 :00 :10 -c :v copy -c :a copy output.mpeg ffmpeg -i test.mpeg -ss 00 :00 :05 -to 00 :00 :10 -c :v libx264 -b :v 2000 k -c :a aac -b :a 128 k output.mpeg ffmpeg -i test.mpeg -ss 00 :00 :05 -to 00 :00 :10 -c :v mpeg2video -c :a mp2 output.mpeg ffmpeg -i test.mpeg -ss 00 :00 :05 -to 00 :00 :10 -c :v copy -c :a copy -bufsize 2000 k output.mpeg
8-3 倒放与加减速 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ffmpeg -i test.mp4 -filter_complex [0 :v ]reverse[v ] -map [v ] -preset superfast output.mp4 ffmpeg -i test.mp4 -vf reverse output.mp4 ffmpeg -i test.mp4 -af areverse -map 0 -c :v copy output.mp4 ffmpeg -i test.mp4 -af areverse -vf reverse -preset superfast output.mp4 ffmpeg -i test.mp4 -af atempo=2 -vf setpts=PTS/2 output.mp4 ffmpeg -i test.mp4 -filter :v "setpts=0.5*PTS" -filter :a "atempo=2.0" output.mp4 ffmpeg -i test.mp4 -an -filter :v setpts=0.5 *PTS output.mp4 ffmpeg -i test.mp4 -filter :v "setpts=2.0*PTS" -filter :a "atempo=0.5" output.mp4
8-4 分离音视频流 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ffmpeg -i test.mp4 -vcodec copy -an output.mp4 ffmpeg -i test.mp4 -acodec copy -vn output.mp3 ffmpeg -i test.mp4 -acodec libmp3lame -vn output.mp3 ffmpeg -i test.mp4 -an output.mp4 ffmpeg -i test.avi -an -vcodec copy output.avi
9 推流拉流
推流拉流
推流:将直播内容推送至服务器的过程。
拉流:服务器已有直播内容,用指定地址将其拉取的过程,VLC媒体播放器官网 。
MediaMTX实时媒体服务器:https://github.com/bluenviron/mediamtx/releases 。
下载安装版本,Windows:mediamtx_v1.4.0_windows_amd64.zip。
解压后,在本地双击运行“mediamtx.exe”,进行本地推流的模拟。
下载安装版本,Ubuntu:mediamtx_v1.4.0_linux_amd64.tar.gz。
命令解压:tar -zxvf mediamtx_v1.4.0_linux_amd64.tar.gz
。
在当前解压的目录中执行命令开启本地媒体服务器:./mediamtx
。
1 2 3 4 5 6 7 8 2024 /01 /18 15 :58 :42 INF MediaMTX v1.4.0 2024 /01 /18 15 :58 :42 INF configuration loaded from C:\Users\Admin\Downloads\mediamtx.yml2024 /01 /18 15 :58 :42 INF [RTSP ] listener opened on :8554 (TCP), :8000 (UDP/RTP), :8001 (UDP/RTCP)2024 /01 /18 15 :58 :42 INF [RTMP ] listener opened on :1935 2024 /01 /18 15 :58 :42 INF [HLS ] listener opened on :8888 2024 /01 /18 15 :58 :42 INF [WebRTC ] listener opened on :8889 (HTTP), :8189 (ICE/UDP)2024 /01 /18 15 :58 :42 INF [SRT ] listener opened on :8890 (UDP)
9-1 推流 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 ffmpeg -re -i test.mp4 -c copy -f rtsp rtsp://127.0 .0.1 :8554 /stream ffmpeg -re -i test.mp4 -c copy -f rtsp -rtsp_transport tcp rtsp://127.0 .0.1 :8554 /stream ffmpeg -re -i test.mp4 -c copy -f flv rtmp://127.0 .0.1 :1935 /stream ffmpeg -re -i test.mp4 -c :v libx264 -c :a aac -f flv rtmp://127.0 .0.1 :1935 /stream ffmpeg -re -i test.mp4 -c copy -f hls http://127.0 .0.1 :8888 /stream.m3u8 ffmpeg -re -i test.mp4 -c copy -f hls -method POST http://127.0 .0.1 :8888 /stream.m3u8 ffmpeg -re -i test.mp4 -c copy -f webm http://127.0 .0.1 :8889 /stream ffmpeg -re -i test.mp4 -c :v libvpx -c :a libvorbis -auto-alt-ref 0 -f webm http://127.0 .0.1 :8889 /stream ffmpeg -re -i test.mp4 -c copy -f mpegts srt://127.0 .0.1 :8890 ffmpeg -re -i test.mp4 -c copy -f mpegts "srt://127.0.0.1:8890?pkt_size=1316" ffmpeg -re -i test.mp4 -c copy -f mpegts "srt://:8890?pkt_size=1316&mode=listener" ffmpeg -re -stream_loop -1 -i test.mp4 -c copy -f rtsp rtsp://127.0 .0.1 :8554 /stream
9-2 拉流 1 2 3 4 5 6 7 8 ffmpeg -re -stream_loop -1 -i test.mp4 -c :v copy -c :a aac -f rtsp rtsp://127.0 .0.1 :8554 /stream ffplay rtsp://127.0 .0.1 :8554 /stream ffmpeg -timeout 30000000 -i rtsp://127.0 .0.1 :8554 /stream -c copy output.mp4