ffmpeg 基础准备 和 命令使用

 

  • 将a.mp4(4k 60fps)另存为 a.h265
     ffmpeg -i a.mp4 -c:v hevc -preset medium -crf 28 -c:a copy -x265-params "fps=60" a.h265

 

  • ts 里提取音频并准确的截取音频
    ffmpeg -i bg.ts -vn -c:a libmp3lame output.mp3
    
    
    ffmpeg -i output.mp3 -ss 00:00:02 -c:a copy output_trimmed.mp3 // 由于 MP3 文件的编码方式,ffmpeg 可能仍然无法精确到毫秒级别地裁剪 MP3 文件, 需要保证精度如下:
    # 1.转换为 WAV  
    ffmpeg -i output.mp3 -vn -c:a pcm_s16le output.wav  
    # 2.从 WAV 裁剪  
    ffmpeg -i output.wav -ss 00:00:02 -c:a copy output_trimmed.wav  
    # 3.将裁剪后的 WAV 转换回 MP3  
    ffmpeg -i output_trimmed.wav -c:a libmp3lame output_trimmed.mp3
  • 将原始 bgr 二进制文件转为 jpg: ffmpeg -f rawvideo -pixel_format bgr24 -video_size 224x224 -i 224x224_bgr.bgr -frames:v 1 output.jpg

 

  • 原始图像为 ts.jpg (图像尺寸为1024*683) 将其转换为 YUV420P_U8 图像格式(图像尺寸为 224*224)并保存为新文件
     
    ffmpeg -i ts.jpg -vf "scale=224:224:flags=lanczos" -c:v rawvideo -pix_fmt yuv420p -f rawvideo 224x224_yuv420p.yuv
    
        -i a.jpg:指定输入文件为 a.jpg。
        -vf "scale=224:224:flags=lanczos":使用视频滤镜(video filtergraph)来缩放图像到 224x224 大小。这里我们使用了 Lanczos 缩放算法以获得较好的图像质量,但你也可以选择其他算法,如 bicubic、bilinear 等。
        -c:v rawvideo:指定输出编码器为原始视频编码器,因为我们想要输出原始像素数据而不是视频文件。
        -pix_fmt yuv420p:指定输出像素格式为 YUV420P。
        -f rawvideo:指定输出格式为原始视频格式。
        a_224x224_yuv420p.yuv:输出文件名。
  • 原始图像为 ts.jpg (图像尺寸为1024*683) 将其转换为 YUV420SP_U8 图像格式(图像尺寸为 256*256)
    ffmpeg -i ts.jpg -vf "scale=256:256,format=nv21" -frames:v 1 -c:v rawvideo -pix_fmt nv21 -f rawvideo ts_nv21.yuv
    
        -i ts.jpg:输入文件为ts.jpg。
        -vf "scale=256:256,format=nv21":使用视频滤镜(video filtergraph)来缩放图像到256x256,并设置像素格式为nv21。
        -frames:v 1:只输出一帧视频,因为我们只处理单张图像。
        -c:v rawvideo:使用原始视频编码器。
        -pix_fmt nv21:指定输出像素格式为nv21。
        -f rawvideo:指定输出格式为原始视频格式。
        ts_nv21.yuv:输出文件名。
  • 从 MP4 视频中截取单帧并将其保存为 YUV 文件:
    • ffmpeg -i input.mp4 -vf "select=eq(n\,1)" -vframes 1 -s 640*360 -pix_fmt yuv420p output.yuv
    • -i input.mp4:指定输入的 MP4 视频文件。
      -vf "select=eq(n\,1)":使用 select 过滤器选取第1帧(这里的 n 表示帧编号,从0开始计数,所以这里实际上是第二帧)。
      -vframes 1:设置输出的视频帧数量为1帧。
      -pix_fmt yuv420p:指定输出像素格式为 YUV 4:2:0 planar。
      -s 640*360: 制度输出的分辨率,可以不加
      output.yuv:指定输出的 YUV 文件名。
      
      如果需要截取其他帧,只需将 1 替换为相应的帧编号即可。注意,YUV 格式通常用于原始视频数据处理,它不是一种常见的图片查看器可以直接打开的格式,通常在开发或视频处理工具中使用。
  • 查看相机:
    • ffmpeg -list_devices true -f dshow -i dummy   // ffmpeg -f dshow -i <摄像头设备名称> 这样看的更详细
  • 将MP4文件中的H.264编码视频转换为H.265编码:
    • ffmpeg -i ts0.mp4 -c:v libx265 -crf 28 -preset medium -c:a copy ts1.mp4
    • -i ts0.mp4: 指定输入文件为ts0.mp4。
      -c:v libx265: 设置视频编码器为H.265/HEVC,通过libx265库实现。
      -crf 28: 使用恒定率因子(Constant Rate Factor)来控制视频的质量。数值范围一般在18至51之间,数值越低,视频质量越高,但文件也越大。
      -preset medium: 设置编码速度和压缩效率之间的平衡。可以选择不同的预设值,如ultrafast、fast、medium、slow、slower、veryslow等,速度越慢,压缩效果通常越好。
      -c:a copy: 音频流保持不变,直接复制到输出文件中。

 

基础
ffmpeg操作应用(ffmpeg编译好的库:http://ffmpeg.org/download.html#build-windows)

一.下载和环境配置:
官网地址:http://ffmpeg.org/  -- 点击Download -- 点击windous图标 -- 点击windows builds from gran.dev -- 点击 git里的Links里的https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-full.7z -- 下载之后解压 -- 将路径添加到环境变量(C:\web\ffmpeg\ffmpeg-2021-06-16-git-604924a069-full_build\bin)-- cmd输入ffmpeg -version验证

二.ffmpeg命令行工具介绍:
ffmpeg.exe —— 音视频编解码;ffplay.exe —— 多媒体播放器;ffprobe.exe —— 查看文件属性;ffserver.exe —— 流媒体服务器(使用HTPP协议和RTSP协议)

三.ffmpeg软件库的介绍:
libavcodec —— 编解码器有关的库;libavdevice —— 设备有关的,比如摄像头;libavfilter —— 内容滤镜有关;libavformat —— 文件格式有关;
libavutil —— 工具类;libpostproc —— 后期处理有关;libswresample —— 音频采样有关;libswscale —— 转换有关

四.ffmpeg命令行语法:
ffmpeg {全局参数} {输入文件参数} -i {输入文件} {输出文件参数} {输出文件} 如:

ffmpeg \
-y \ # 全局参数
-c:a libfdk_aac -c:v libx264 \ # 输入文件参数。输入文件的音频编码格式是 aac,视频编码格式是 H.264
-i input.mp4 \ # 输入文件
-c:v libvpx-vp9 -c:a libvorbis \ # 输出文件参数。输出文件的视频编码格式是 VP9,音频格式是 Vorbis
output.webm # 输出文件

但其实这样默认的数据不用特别指出ffmpeg会自己识别所以可以写成:ffmpeg -i input.avi output.mp4

五.详情:
-s 分辨率(宽与高);-vf scale 调整分辨率;-y 输出时覆盖同名文件;-f 设定输出格式 ;-r 设定帧速率,默认为25;-b 设定视频流量,默认为200Kbit/s
-aspect 设定画面的比例;-ar 设定采样率;-an 去除音频流;-ab bitrate 设置音频码率;-ar freq 设置音频采样率;-acodec codec 使用codec编解码
-vn 去除视频流;-c:指定编码器;-c:v (-vcodec)指定视频编码器;-c:a (-acodec)指定音频编码器;-c copy 直接复制,不经过重新编码;-preset 指定输出的视频质量
-target type 设置目标文件类型;-hq 激活高质量设置;-b bitrate 设置比特率;-s size 设置帧大小;
-bt tolerance 设置视频码率容忍度kbit/s;-maxrate bitrate设置最大视频码率容忍度;-minrate bitreate 设置最小视频码率容忍度;
-bufsize size 设置码率控制缓冲区大小;-vcodec codec 强制使用codec编解码方式。如果用copy表示原始编解码数据必须被拷贝。
-----------------------------------------------------------------------
mp3转ogg:ffmpeg -i a.mp3 a.ogg
mp4转ogv:ffmpeg -i a.mp4 a.ogv
webm转mp4:ffmpeg -i video.webm -vcodec copy video.mp4  // -vcodec:视频的编码器;cooy:直接拷贝视频。这些指定的话比直接 ffmpeg -i video.webm video.mp4 更快
mp4转yuv:ffmpeg -i a.mp4 -an -c:v rawvideo -pix_fmt yuv420p a.yuv // yvu原始数据会比较大;-an:去掉音频;-c:v:指定视频编码器;
mp4单帧转yuv: ffmpeg -i ts.mp4 -f segment -segment_time 0.01 -frames 2 -pix_fmt yuv420p ./frames_%4d.yuv
mp4封装格式视频转h264编码文件:ffmpeg -i input.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.264
播放h264编码文件:ffmpeg -stats -f h264 out.264

------------------------------------------------------------------------
1、将文件当做直播送至live
  ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName
2、将直播媒体保存至本地文件
  ffmpeg -i rtmp://server/live/streamName -c copy dump.flv
3、将其中一个直播流,视频改用h264压缩,音频不变,送至另外一个直播服务流
  ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v libx264 -vpre slow -f flv rtmp://server/live/h264Stream
4、将其中一个直播流,视频改用h264压缩,音频改用faac压缩,送至另外一个直播服务流
  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
5、将其中一个直播流,视频不变,音频改用faac压缩,送至另外一个直播服务流
  ffmpeg -i rtmp://server/live/originalStream -acodec libfaac -ar 44100 -ab 48k -vcodec copy -f flv rtmp://server/live/h264_AAC_Stream
6、将一个高清流,复制为几个不同视频清晰度的流重新发布,其中音频不变
  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
7、功能一样,只是采用-x264opts选项
  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
8、将当前摄像头及音频通过DSSHOW采集,视频h264、音频faac压缩后发布
  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
9、将一个JPG图片经过h264压缩循环输出为mp4视频
  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
10、将普通流视频改用h264压缩,音频不变,送至高清流服务(新版本FMS live=1)
  ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v libx264 -vpre slow -f flv “rtmp://server/live/h264Stream live=1〃
11.采集usb摄像头视频命令:
  ffmpeg -t 20 -f vfwcap -i 0 -r 8 -f mp4 cap1111.mp4
  ./ffmpeg -t 10 -f vfwcap -i 0 -r 8 -f mp4 cap.mp4
  具体说明:我们采集10秒,采集设备为vfwcap类型设备,第0个vfwcap采集设备(如果系统有多个vfw的视频采集设备,可以通过-i num来选择),每秒8帧,输出方式为文件,格式为mp4。
12.最简单的抓屏:
  ffmpeg -f gdigrab -i desktop out.mpg 
13.从屏幕的(10,20)点处开始,抓取640x480的屏幕,设定帧率为5 :
  ffmpeg -f gdigrab -framerate 5 -offset_x 10 -offset_y 20 -video_size 640x480 -i desktop out.mpg 
14.ffmpeg从视频中生成gif图片:
  ffmpeg -i capx.mp4 -t 10 -s 320x240 -pix_fmt rgb24 jidu1.gif
15.分离视频音频流
  ffmpeg -i input_file -vcodec copy -an output_file_video  //分离视频流
  ffmpeg -i input_file -acodec copy -vn output_file_audio  //分离音频流
16.视频解复用(复用概念数字电视的传输流及复用技术 - 九加十一 - 博客园 (cnblogs.com))
  ffmpeg –i test.mp4 –vcodec copy –an –f m4v test.264
  ffmpeg –i test.avi –vcodec copy –an –f m4v test.264
17.视频转码
  ffmpeg –i test.mp4 –vcodec h264 –s 352*278 –an –f m4v test.264              //转码为码流原始文件
  ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an –f m4v test.264  //转码为码流原始文件
  ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi            //转码为封装文件
  //-bf B帧数目控制,-g 关键帧间隔控制,-s 分辨率控制
18.视频封装
  ffmpeg –i video_file –i audio_file –vcodec copy –acodec copy output_file
19.视频剪切
  ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg        //提取图片
  ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi    //剪切视频
        ffmpeg -ss 15 -to 98 -i input.mp4 -c:v copy output.mp4
  //-r 提取图像的频率,-ss 开始时间,-t 持续时间
20.视频录制
  ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec copy out.avi
21.YUV序列播放
  ffplay -f rawvideo -video_size 1920x1080 input.yuv
22.YUV序列转AVI
  ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi
23.压缩转码mp4文件
  ffmpeg -i input.avi -s 640x480 output.avi
  ffmpeg -i input.avi -strict -2 -s vga output.avi
------------------------------------------------------------------------
查看视频文件的元信息:ffmpeg -i input.mp4
查看视频文件的元信息过滤一些冗余信息:ffmpeg -i input.mp4 -hide_banner
编码转编码(h264):ffmpeg -i [input.file] -c:v libx264 output.mp4
编码转编码(h265):ffmpeg -i [input.file] -c:v libx265 output.mp4
指定码率最小为964K,最大为3856K,缓冲区大小为 2000K:ffmpeg -i input.mp4 -minrate 964K -maxrate 3856K -bufsize 2000K output.mp4
改变视频分辨率,从 1080p 转为 480p:ffmpeg -i input.mp4 -vf scale=480:-1 output.mp4
h264视频转ts视频流:ffmpeg -i test.h264 -vcodec copy -f mpegts test.ts
H264视频转mp4:ffmpeg -i test.h264 -vcodec copy -f mp4 test.mp4
ts视频转mp4:ffmpeg -i test.ts -acodec copy -vcodec copy -f mp4 test.mp4
mp4视频转flv:ffmpeg -i test.mp4 -acodec copy -vcodec copy -f flv test.flv 
将一段音频与一段视频混合:ffmpeg -i son.wav -i video_origine.avi video_finale.mpg
截取一张352x240尺寸大小的,格式为jpg的图片:ffmpeg -i test.asf -y -f image2 -t 0.001 -s 352x240 a.jpg
把视频的前30帧转换成一个Animated Gif:ffmpeg -i test.asf -vframes 30 -y -f gif a.gif
------------------------------------------------------------------
去除水印:ffmpeg -i origin.mp4 -vf delogo=1000:32:260:86 output.mp4 // 1000:32:260:86是要去除的地方距离左上角距离是1000和32,要去除的宽高是260和86
视频裁剪:ffmpeg -i origin.mp4 -vcodec copy -acodec copy -ss 00:01:26 -to 00:01:30 output.mp4 -y // 00:01:26是要裁剪的开始时间,00:01:30是要裁剪的结束时间
添加logo:ffmpeg -i output.mp4 -i pptv.png -filter_complex overlay output3.mp4 // 默认是左上角、overlay=W-w 是右上角、overlay=0:H-h 是左下角、overlay=W-w:H-h 是右下角
为音频添加封面: ffmpeg\ -loop 1\ -i cover.jpg -i input.mp3\ -c:v libx264 -c:a aac -b:a 192k -shortest\ output.mp4 //-loop 1参数表示图片无限循环,-shortest参数表示音频文件结束,输出视频就结束
连续对1秒钟的视频进行截图: ffmpeg\ -y\ -i input.mp4\ -ss 00:01:24 -t 00:00:01\ output_%3d.jpg
只截一张图(指定只截取一帧):ffmpeg\ -ss 01:23:45\ -i input\ -vframes 1 -q:v 2\ output.jpg
添加音轨(将外部音频加入视频):ffmpeg\ -i input.aac -i input.mp4\ output.mp4 // 有音频和视频两个输入文件,FFmpeg 会将它们合成为一个文件
提取音频:ffmpeg -i origin.mp4 -acodec copy -vn voice.aac
提取视频:ffmpeg -i origin.mp4 -vcodec copy -an video0.mp4

 

 

获取 电脑设备麦克风名称:ffmpeg -list_devices true -f dshow -i dummy
录制 16bit/44.1khz的文件(结束录制Crtl+C):ffmpeg -f dshow -i audio="麦克风阵列 (Realtek(R) Audio)" -f s16le -ar 44100 D:\fx\a.pcm

播放pcm :ffplay -ar 44100 -ac 2 -f s16le audio.pcm  // -channels 1
( 44100采样率;s16le格式播放、s有符号(还有u,f)、16bit(采样位深度和前面的符号结合起来)、le小端(be大端))

提取全部音频:ffmpeg -i mojito.ts -q:a 0 -map a mojito.mp3

提取视频指定时间段内的音频:ffmpeg -i input.mp4 -ss 00:03:05 -t 00:00:45.0 -q:a 0 -map a output.mp3
( 3分零5秒开始,往后45秒,即到3分50秒结束,不指定t选项,则一直到末尾 )

提取音频指定时间段内的音频:ffmpeg  -i  aa.mp3 -ss 00:08:06  -to  00:10:30  ab.mp3 // -acodec copy
( -to 直接是最终时间;-acodec copy 表示音频编码格式和来源相同,就可以直接复制了)

拼接 mp3: ffmpeg -i a1.mp3 -i a2.mp3 -filter_complex "[0:0] [1:0] concat=n=2:v=0:a=1 [a]" -map [a] a3.mp3
(n=2拼接的数量)

音频去除人声:ffmpeg -i aa.mp3 -af pan="stereo|c0=c0|c1=-1*c1" -ac 1 ab.mp3

修改视频编码方式为h264并重新封装为 mp4: ffmpeg -i yla.mp4 -vcodec h264 yla2.mp4

修改音频编码方式并重新封装为ogg: ffmpeg -i yla.mp4 -acodec libvorbis yla2.ogg

ffmpeg提取yuv: ffmpeg -i a.mp4 -s hh:mm:ss -pix_fmt yuv420p a.yuv

H264视频转ts视频流: ffmpeg -i a.h264 -vcodec copy -f mpegts a.ts // -vcodec copy 表示来源相同,直接复制

mp4视频转flv:ffmpeg -i test.mp4 -acodec copy -vcodec copy -f flv test.flv

分析流信息: ffprobe -i rtsp://192.168.1.162:554/0/0/0
(ffprobe -i a.mp4  // -show_format 查看音视频文件的封装格式、 -show_streams 查看音视频文件的流信息 )

播放流视频: ffplay -i rtsp://192.168.1.162:554/0/0/0

从视频提取1帧图片:
    ffmpeg -i test.mp4 -r 1 -ss 00:00:05 -t 1 image-%3d.jpg // ss 开始 往后到 -t 秒 每秒提取 -r 帧
    ffmpeg -i test.mp4 -r 1 -ss 00:00:05 -t 1 -vframes 1 image-%3d.jpg // -vframes 10 ; -vframes,表示截取多少帧
 
 视频截取:
 ffmpeg -i h265.mp4 -ss 00:03 -to 00:08 -c:v libx264 _h265.mp4
 ffmpeg -ss 00:00:03 -i h264.mp4 -to 00:00:08 -c:v copy -c:a copy  h264_.mp4
 ffmpeg -i ts.mp4 -ss 00:03 -to 00:08 -c:v libx264 -crf 30 ts_.mp4
 
 为音频增加封面图片:
 ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4
 
 压缩媒体文件:
 ffmpeg -i audio_input.mp3 -b:a 192k audio_output.mp3  // -b:a 降低比特率 
 ffmpeg -i video_input.mp4 -b:v 1000k -bufsize 1000k video_output.mp4  // -b:v 降低视频比特率 ; -crf 28 恒定质量因子,较小的crf意味着较大的码率; -r 指示帧率
 
 查看支持的 Windows DirectShow 输入设备,采集视频和音频设备,包含设备名称,设备类型等信息(或者取设备管理器):
 ffmpeg -list_devices true -f dshow -i dummy
 
 录制视频和画中画:https://newzone.top/posts/2022-11-03-ffmpeg_screen_recording.html#%E8%BE%93%E5%87%BA%E8%A7%86%E9%A2%91-%E7%94%BB%E4%B8%AD%E7%94%BB

看ffmpeg支持的设备列表:ffmpeg -list_devices true -f dshow -i dummy
通过声卡录制声音到本地:ffmpeg -f dshow -i audio="virtual-audio-capturer" -acodec libmp3lame window.mp3
录制视频到本地:ffmpeg -f dshow -i video="screen-capture-recorder" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency MyDesktop.mp4
音频和视频一起录制:ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer" -pix_fmt yuv420p -vcodec libx264 -acodec libvo_aacenc -s 1280x720 -r 25 -q 10 -ar 44100 -ac 2 -tune zerolatency -preset ultrafast -f mpegts - | ffmpeg -f mpegts -i - -c copy -bsf:a aac_adtstoasc -f flv temp.flv 

 

posted @ 2022-07-13 18:00  封兴旺  阅读(171)  评论(0编辑  收藏  举报

联系方式: 18274305123(微信同号)