FFmpeg命令

提取音频PCM/AAC文件

cpp 复制代码
ffmpeg -i video1.mp4 -vn -acodec pcm_s16le -ar 44100 -ac 2 output_file.wav

-i rtsp://your_rtsp_stream_url:指定 RTSP 流 URL。
-vn:禁用视频流,仅提取音频。
-acodec pcm_s16le:选择 PCM 编解码器(16 位小端格式)。
-ar 44100:设置音频采样率为 44.1kHz。
-ac 2:设置音频通道为立体声(2 个通道)。
output_file.wav:输出的 WAV 文件。


ffmpeg -i video1.mp4 -vn -acodec copy output_file.aac


-i video1.mp4:指定读取文件,也可以指定rtspurl。
-vn:禁用视频流,仅提取音频。
-acodec copy:直接复制音频流,不进行重新编码(如果流本身是 AAC 格式)。
output_file.aac:输出的 AAC 文件。


音频质量和参数设置:可以根据需要调整采样率(-ar)和通道数(-ac)等参数,来改变音频的质量和格式。
流的稳定性:如果需要长时间录制,可以添加 -t 参数来指定录制的持续时间(以秒为单位)。
可以通过添加 -rtsp_transport tcp 来指定使用 TCP 传输以提高稳定性

提取视频YUV/H264文件

cpp 复制代码
ffmpeg -i rtsp://your_rtsp_stream_url -vn -acodec copy -vcodec copy output_file.h264
ffmpeg -i rtsp://your_rtsp_stream_url -vn -pix_fmt yuv420p output_file.yuv
ffmpeg -i input_file.mp4 -vn -pix_fmt yuv420p output_file.yuv


-i rtsp://your_rtsp_stream_url:指定 RTSP 流 URL(或文件路径)。
-vn:禁用视频流,仅提取视频。
-pix_fmt yuv420p:指定像素格式为 YUV 4:2:0,常用于视频编码。
output_file.yuv:输出的 YUV 文件。

YUV 文件的帧率和分辨率会受到输入视频文件的限制。
如果需要指定特定的帧率或分辨率,可以使用 -r 和 -s 参数,例如:
-r 30:设置帧率为 30 fps
-s 1920x1080:设置分辨率为 1920x1080

解复用和复用

  • 解复用(Demuxing)是将多种流提取出来,并保留原始编码。
  • 复用(Muxing)是将多个流(音频、视频、字幕)打包到一个容器中。
cpp 复制代码
ffmpeg -i video.h264 -i audio.aac -c:v copy -c:a copy -strict experimental output.mp4

-i video.h264 和 -i audio.aac:指定输入文件,分别为视频和音频流。
-c:v copy:复制视频流,不进行转码。
-c:a copy:复制音频流,不进行转码。
-strict experimental:允许使用一些实验性功能(例如 AAC 解码/编码)。
output.mp4:输出的 MP4 文件。

音视频录制

列出所有可用的视频设备:

cpp 复制代码
ffmpeg -list_devices true -f dshow -i dummy

[dshow @ 000001A2F2ACF880] "BisonCam,NB Pro" (video)
[dshow @ 000001A2F2ACF880]   Alternative name "@device_pnp_\\?\usb#vid_5986&pid_9102&mi_00#6&3b901911&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"
[dshow @ 000001A2F2ACF880] "麦克风 (Realtek High Definition Audio)" (audio)
[dshow @ 000001A2F2ACF880]   Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{B510E1FF-D844-4579-ABA6-DDBE347E13B6}"

录制音视频

cpp 复制代码
ffmpeg -f dshow -i video="BisonCam,NB Pro" -t 00:05:00 output.mp4
ffmpeg -f dshow -i audio="麦克风设备名称" -t 00:05:00 output_audio.wav
ffmpeg -f dshow -i video="视频设备名称":audio="麦克风设备名称" -t 00:05:00 output.mp4

-f dshow:指定使用 DirectShow 捕捉视频设备(Windows)。
-i video="视频设备名称":指定视频设备名称。可以用 ffmpeg -list_devices true -f dshow -i dummy 命令查看可用设备。
-t 00:05:00:录制时长,00:05:00 是 5 分钟。
output.mp4:输出的文件

录制全屏或特定区域

全屏

cpp 复制代码
ffmpeg -f gdigrab -framerate 30 -i desktop -t 00:05:00 output_screen.mp4

-f gdigrab:指定使用 GDI 捕捉屏幕。
-framerate 30:设置帧率为 30 fps。
-i desktop:表示捕捉全屏。
-t 00:05:00:录制 5 分钟。
output_screen.mp4:输出的视频文件

指定窗口

cpp 复制代码
ffmpeg -f gdigrab -framerate 30 -i title="计算器" -t 00:05:00 output_screen.mp4
-video_size 640x480:设置要捕获的区域的分辨率。
:0.0+100,100:从 x=100, y=100 的位置开始捕获区域。

视频裁剪和合并

裁剪

cpp 复制代码
ffmpeg -i video1.mp4 -ss 00:00:00 -t 00:00:05 -c:v copy -c:a copy output.mp4
ffmpeg -i input.mp4 -ss 00:01:00 -t 00:00:30 -c:v libx264 -c:a aac output.mp4

-i input.mp4:输入文件。
-ss 00:01:00:从视频的第 1 分钟开始裁剪。
-t 00:00:30:裁剪 30 秒的视频。
-c:v copy -c:a copy:视频和音频都使用原始流进行拷贝(避免重新编码,提高速度)。
-c:v libx264:使用 H.264 编码器对视频重新编码。
-c:a aac:使用 AAC 编码器对音频重新编码。
output.mp4:输出文件

注意:-ss 选项如果放在 -i 参数前面,会直接跳过指定时间点进行处理,这样裁剪时会更快速,但可能不完全精确。如果 -ss 放在 -i 后面,裁剪更为精确,但可能需要更多的处理时间。

合并

创建一个文本文件(例如 filelist.txt),列出要合并的所有视频文件,格式如下:、

cpp 复制代码
file 'video1.mp4'
file 'video2.mp4'
file 'video3.mp4'
cpp 复制代码
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4

-f concat:指定合并操作。
-safe 0:允许使用相对路径。
-i filelist.txt:指定包含文件路径的文本文件。
-c copy:直接复制视频流和音频流,避免重新编码。

注意

  • 所有输入的视频文件必须具有相同的编码格式、分辨率和帧率。否则,-c copy 可能无法成功合并。
  • 如果输入文件的编码不同,建议不要使用 -c copy,而是选择重新编码合并:
cpp 复制代码
ffmpeg -f concat -safe 0 -i filelist.txt -c:v libx264 -c:a aac output.mp4

合并不同格式的视频文件(使用 concat 包装器)

cpp 复制代码
ffmpeg -i video1.mp4 -c:v libx264 -c:a aac -strict experimental video1_converted.mp4
ffmpeg -i video2.mp4 -c:v libx264 -c:a aac -strict experimental video2_converted.mp4
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4

合并没有中断的视频流(视频拼接)

cpp 复制代码
ffmpeg -i "concat:video1.mp4|video2.mp4" -c copy output.mp4
-i "concat:video1.mp4|video2.mp4":直接拼接两个视频文件,格式相同的情况下。
-c copy:直接拷贝视频流和音频流,避免重新编码。

视频合并时处理音频

cpp 复制代码
ffmpeg -i input1.mp4 -an -c:v copy output_noaudio.mp4
-an:禁用音频。
-c:v copy:直接拷贝视频流。
使用单独的音频文件

如果你有一个单独的音频文件想要与视频合并,可以使用 -i 来指定音频输入文件:

cpp 复制代码
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -strict experimental output_with_audio.mp4
-i video.mp4:视频文件。
-i audio.mp3:音频文件。
-c:v copy:直接拷贝视频流。
-c:a aac:使用 AAC 编码器进行音频编码。

图片/视频转换

视频转换为图片序列

cpp 复制代码
ffmpeg -i video1.mp4 -vf "fps=25" image%d.png  

-i input_video.mp4:输入视频文件。
-vf "fps=1":使用视频过滤器,设置帧率为 25 fps(即每秒提取25帧)。
image%d.png:保存为图片序列,%d 表示图片编号(例如 image1.png, image2.png,依此类推)。

图片转换为视频

cpp 复制代码
ffmpeg -framerate 30 -i image%d.png -c:v libx264 -r 30 -pix_fmt yuv420p output_video.mp4

-framerate 30:指定输入图片的帧率为 30 帧每秒(fps)。
-i image%d.png:表示输入的图片序列,%d 是一个占位符,表示数字顺序。例如,image1.png, image2.png, image3.png。
-c:v libx264:使用 H.264 编码器。
-r 30:设置输出视频的帧率为 30 fps。
-pix_fmt yuv420p:指定视频像素格式为 yuv420p,这是大多数播放器所支持的像素格式。
output_video.mp4:输出的视频文件名。

如果你希望图片间隔不同,可以使用 -framerate 和 -vf(视频过滤器)来设置间隔。
ffmpeg -framerate 1/2 -i image%d.png -c:v libx264 -r 30 -pix_fmt yuv420p output_video.mp4
-framerate 1/2 表示每 2 秒显示一张图片(间隔 2 秒),-r 30 表示输出视频的帧率是 30 fps。

调整视频输出的尺寸

cpp 复制代码
ffmpeg -framerate 30 -i image%d.png -s 1280x720 -c:v libx264 -r 30 -pix_fmt yuv420p output_video.mp4
-s 1280x720:设置输出视频的分辨率为 1280x720。

调整视频的音频和图片的融合

cpp 复制代码
ffmpeg -framerate 30 -i image%d.png -i audio.mp3 -c:v libx264 -r 30 -pix_fmt yuv420p -c:a aac -strict experimental output_video.mp4
-i audio.mp3:指定音频文件作为输入。
-c:a aac:使用 AAC 编码器处理音频。

直播推流和拉流

水印/画中画/九宫格滤镜

水印

cpp 复制代码
ffmpeg -i video1.mp4 -i logo.png -filter_complex "overlay=W-w-10:H-h-10" -c:a copy output_video.mp4

-i input.mp4:输入的视频文件。
-i watermark.png:输入的水印图片。
-filter_complex "overlay=W-w-10:H-h-10":通过 overlay 滤镜将水印放置在视频的右下角,W-w-10 是指将水印放置在视频宽度减去水印宽度再减去 10 像素的位置(即右下角),H-h-10 是将水印放置在视频高度减去水印高度再减去 10 像素的位置(即下角)。
-c:a copy:音频流不进行重新编码,直接复制。
output_video.mp4:输出的视频文件。

画中画

cpp 复制代码
ffmpeg -i video1.mp4 -i video2.mp4 -filter_complex "[1:v] scale=320:240 [ov]; [0:v][ov] overlay=W-w-10:H-h-10" -c:a copy output_video2.mp4 


[0:v][1:v] overlay=W-w-10:H-h-10:第一个 [0:v] 代表主视频,第二个 [1:v] 代表小视频,通过 overlay 滤镜将小视频放置在主视频的右下角。
W-w-10 和 H-h-10:指定小视频的定位在主视频的右下角。
-c:a copy:保持原有音频流不变。

[1:v] scale=320:240 [ov]:将第二个视频(小视频)缩放为 320x240。
[0:v][ov] overlay=W-w-10:H-h-10:将缩放后的 ov 小视频嵌入主视频中。
相关推荐
aaon223573 小时前
ubuntu ffmpeg 安装踩坑
linux·ubuntu·ffmpeg
m0_748245175 小时前
SpringCloud-使用FFmpeg对视频压缩处理
spring·spring cloud·ffmpeg
渔舟唱晚@13 小时前
FFmpeg+WebSocket+JsMpeg实时视频流实现方案
websocket·网络协议·ffmpeg
xcg3401231 天前
关于视频抽帧调用虹软人脸识别的BufferedImage读取优化策略
ffmpeg·音视频·视频抽帧
繁依Fanyi1 天前
使用 FFmpeg 剪辑视频指南
java·服务器·开发语言·ffmpeg·音视频
deadknight92 天前
定期自动统计大表执行情况
ffmpeg
cuijiecheng20184 天前
音视频入门基础:RTP专题(9)——FFmpeg接收RTP流的原理和内部实现
ffmpeg·音视频
偶是老李头4 天前
Ubuntu虚拟机NDK编译ffmpeg
linux·ubuntu·ffmpeg·android ndk
lucky-billy5 天前
Qt 中使用 ffmpeg 获取采集卡数据录制视频
qt·ffmpeg·音视频