FFmpeg 环境安装 + 开发中常用的命令
1、快速安装 FFmpeg
ffmpeg -version
- Windows 系统配置开发环境:以 CMake 为例,替换其中的路径变量即可
cmake_minimum_required(VERSION 3.20)
project(ffmpeg_test)
set(CMAKE_CXX_STANDARD 20)
set(FFMPEG7_DIR "path/to/ffmpeg")
set(TARGET_NAME ${PROJECT_NAME})
add_executable(${TARGET_NAME} main.cpp)
target_include_directories(${TARGET_NAME} PRIVATE
${FFMPEG7_DIR}/include
)
target_link_directories(${TARGET_NAME} PRIVATE
${FFMPEG7_DIR}/lib
)
set(FFMPEG7_LIBS
avformat.lib # 文件格式和协议库
avcodec.lib # 编解码库, 支持第三方 codec
avutil.lib # 核心工具库
avdevice.lib # 输入输出设备库
avfilter.lib # 音视频滤镜库
swscale.lib # 图像缩放和格式转换库
swresample.lib # 音频重采样和格式转换库
postproc.lib # 解码后的处理库
)
target_link_libraries(${TARGET_NAME} PRIVATE
${FFMPEG7_LIBS}
)
if (WIN32)
file(GLOB FFMPEG7_DLLS "${FFMPEG7_DIR}/bin/*.dll")
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FFMPEG7_DLLS} $<TARGET_FILE_DIR:${TARGET_NAME}>
COMMENT "Copying all required DLLs to output directory"
)
endif ()
#include <cstdio>
extern "C" {
#include <libavformat/avformat.h>
}
int main() {
printf("FFmpeg version: %s\n", av_version_info());
return 0;
}
2、ffplay 命令
ffplay a.mp4 -fs
ffplay a.mp4 -autoexit -fs
ffplay a.mp4 -loop 2 -fs
ffplay a.mp4 -ss 2 -fs
ffplay a.mp4 -t 2 -fs
ffplay a.mp4 -x 512 -y 512
ffplay a.mp4 -vf "setpts=0.5*PTS" -af "atempo=2" -fs
ffplay a.mp4 -an
ffplay a.aac -showmode 1
ffplay a.mp4 -sync audio
ffplay a.mp4 -vcodec name
ffplay a.mp4 -vf hflip -fs
ffplay a.mp4 -vf vflip -fs
ffplay a.mp4 -vf transpose=1 -fs
ffplay a.mp4 -vf transpose=2 -fs
ffplay a.mp4 -vf transpose=1,transpose=1 -fs
ffplay -pixel_format yuv420p -video_size 1920*1080 -framerate 5 -i yuv420p_a.yuv -fs
ffplay -pixel_format rgb24 -video_size 1920*1080 -framerate 5 -i rgb24_a.rgb -fs
ffplay -ar 48000 -ac 2 -f f32le -i 48000_2_f32le.pcm
P 或 <SPACE>
F 或 双击
Q 或 <ESC>
S
W
<LEFT> 和 <RIGHT>
<UP> 和 <DOWN>
9 和 0
M
C
3、ffprobe 命令
ffprobe a.png -hide_banner -show_format
ffprobe a.mp4 -v error -show_format -print_format json
ffprobe a.mp4 -v error -show_streams -print_format json
ffprobe a.mp4 -v error -show_format -show_streams -print_format json > a.txt
ffprobe a.mp4 -hide_banner -show_frames -print_format json > frames.txt
codec_name=h264
codec_type=video
width=1920
height=1080
duration=78.730000
bit_rate=12917774
r_frame_rate=30/1
nb_frames=2362
has_b_frames=1
nal_length_size=4
pix_fmt=yuvj420p
color_space=bt709
4、ffmpeg 命令
- ffmpeg 常见的编解码器
- libx264/libx265/libaom-av1:开源的软件编码器,较慢
- h264_nvenc/hevc_nvenc/av1_nvenc:NVIDIA 显卡的硬件编码器
- h264_cuvid/hevc_cuvid/av1_cuvid:NVIDIA 显卡的硬件解码器
- h264_amf/hevc_amf/av1_amf:AMD 显卡的硬件编码器,ffmpeg 暂不支持解码
- h264_qsv/hevc_qsv:Intel 显卡的硬件编解码器
- h264_videotoolbox/hevc_videotoolbox:苹果 M 芯片的硬件编码器
- 查看特定编码器用法:
ffmpeg -v error -h encoder=h264_nvenc
- 查看配置信息:
ffmpeg -v error -h
ffmpeg -v error -h muxer=flv
ffmpeg -v error -buildconf
ffmpeg -v error -formats
ffmpeg -v error -muxers
ffmpeg -v error -demuxers
ffmpeg -v error -codecs
ffmpeg -v error -encoders
ffmpeg -v error -decoders
ffmpeg -v error -devices
ffmpeg -v error -protocols
ffmpeg -v error -bsfs
ffmpeg -v error -filters
ffmpeg -v error -pix_fmts
ffmpeg -v error -layouts
ffmpeg -v error -sample_fmts
ffmpeg -v error -colors
ffmpeg -hide_banner -i a.mp4 -an -vcodec copy a.hevc
ffmpeg -hide_banner -i a.mp4 -an -c:v copy a.hevc
ffmpeg -hide_banner -i a.mp4 -vn -acodec copy a.aac
ffmpeg -hide_banner -i a.mp4 -vn -c:a copy a.aac
ffmpeg -hide_banner -i a.hevc -i a.aac -c copy a.mp4
ffmpeg -hide_banner -i a.hevc -c:v copy a.mp4
ffmpeg -hide_banner -i a.mp4 -c copy a.mov
- 音视频转码:假设 a.mp4 格式为1920*1080; 13Mbps + 200Kbps; 60fps
ffmpeg -hide_banner -i a.mp4 -t 0:0:10.000 -c:v h264_amf -b:v 13M -c:a aac -b:a 200k b.mp4
ffmpeg -hide_banner -i a.mp4 -ss 0:0:5.000 -t 0:0:5.000 -c:v h264_amf -b:v 13M -c:a aac -b:a 200k b.mp4
ffmpeg -hide_banner -i a.mp4 -vf "setpts=0.5*PTS" -c:v hevc_amf -b:v 26M -af "atempo=2.0" -c:a aac -b:a 400k -r 120 b.mp4
ffmpeg -hide_banner -i a.mp4 -vf "setpts=0.5*PTS" -c:v hevc_amf -b:v 13M -af "atempo=2.0" -c:a aac -b:a 200k -r 120 b.mp4
ffmpeg -hide_banner -i a.mp4 -vf "setpts=0.5*PTS" -c:v hevc_amf -b:v 13M -af "atempo=2.0" -c:a aac -b:a 200k b.mp4
ffmpeg -hide_banner -i a.mp4 -vf "setpts=2*PTS" -c:v hevc_amf -b:v 6M -af "atempo=0.5" -c:a aac -b:a 100k -r 30 b.mp4
ffmpeg -i rtmp://liteavapp.qcloud.com/live/liteavdemoplayerstreamid -c copy dump.flv
- 视频流转码:假设 a.mp4 格式为1920*1080; 13Mbps + 200Kbps; 60fps
ffmpeg -hide_banner -i a.mp4 -vf "scale=1280:720" -c:v hevc_amf -b:v 6M -c:a copy b.mp4
ffmpeg -hide_banner -i a.mp4 -vf "scale=-1:720" -c:v hevc_amf -crf 18 -c:a copy b.mp4
ffmpeg -i oiiai.gif -filter_complex "[0:v]split[x][z];[z]palettegen[y];[x]scale=50:50[x1];[x1][y]paletteuse" oiiai_50x50.gif
ffmpeg -hide_banner -i a.mp4 -vf "crop=1280:720:320:180" -c:v h264_amf -b:v 6M -c:a copy b.mp4
ffmpeg -hide_banner -i a.mp4 -vf "pad=1920:1200:0:60:black" -c:v h264_amf -b:v 13M -c:a copy b.mp4
ffmpeg -hide_banner -i a.mp4 -i a.png -filter_complex "[1:v]scale=60:60[new_icon];[0:v][new_icon]overlay=1860:0" -c:v h264_amf -b:v 13M -c:a copy b.mp4
ffmpeg -hide_banner -i a.mp4 -i a.mp4 -i a.mp4 -filter_complex "[0:v]pad=1920:3240:0:0[pad];[pad][1:v]overlay=0:1080[pad1];[pad1][2:v]overlay=0:2160" b.mp4
ffmpeg -hide_banner -f lavfi -i nullsrc=size=1920x3240:r=60 -i a.mp4 -i a.mp4 -i a.mp4 -filter_complex "[0:v][1:v]overlay=0:0:shortest=1[temp0];[temp0][2:v]overlay=0:1080[temp1];[temp1][3:v]overlay=0:2160" b.mp4
ffmpeg -hide_banner -i a.mp4 -vf "vflip" -c:v h264_amf -b:v 13M -c:a copy b.mp4
ffmpeg -hide_banner -i a.mp4 -vf "hflip, scale=1920:1080" -c:v h264_amf -b:v 13M -c:a copy b.mp4
ffmpeg -hide_banner -i a.mp4 -vf "transpose=1" -c:v h264_amf -b:v 13M -c:a copy b.mp4
ffmpeg -hide_banner -i a.mp4 -vf "transpose=2" -c:v h264_amf -b:v 13M -c:a copy b.mp4
ffmpeg -hide_banner -i a.mp4 -vf "transpose=1, transpose=1" -c:v h264_amf -b:v 13M -c:a copy b.mp4
ffmpeg -hide_banner -i a.mp4 -t 1 -pix_fmt yuv420p yuv420p_a.yuv
ffmpeg -hide_banner -i a.mp4 -t 1 -pix_fmt yuv420p -s 1920*1080 yuv420p_a.yuv
ffmpeg -hide_banner -i a.mp4 -t 1 -pix_fmt rgb24 rgb24_a.rgb
ffmpeg -hide_banner -i a.mp4 -t 1 -pix_fmt rgb24 -s 1920*1080 rgb24_a.rgb
ffmpeg -hide_banner -s 1920*1080 -pix_fmt yuv420p -i yuv420p_a.yuv -pix_fmt rgb24 rgb24_a1.rgb
ffmpeg -hide_banner -i a.mp4 -af "volume=6dB" -c:v copy -c:a aac -b:a 200k b.mp4
ffmpeg -hide_banner -i a.mp4 -af "volume=-6dB" -c:v copy -c:a aac -b:a 200k b.mp4
ffmpeg -i a.mp4 -ar 48000 -ac 2 -f s16le 48000_16bit_2ch.pcm
- 前后拼接两段视频:a.mp4 和 b.mp4 格式都是 1920*1080; 13Mbps + 200Kbps; 60fps
file 'a.mp4'
file 'b.mp4'
ffmpeg -hide_banner -f concat -safe 0 -i mylist.txt -c copy c.mp4
ffmpeg -hide_banner -f concat -safe 0 -i mylist.txt -c:v h264_amf -b:v 13M -c:a aac -b:a 200k -r 60 c.mp4
ffmpeg -i believe.mp4 -r 15 -f image2 frames/frame-%05d.jpg
ffmpeg -f image2 -framerate 15 -i frames/frame-%05d.jpg -b:v 150k output.mp4
ffmpeg -i test.mp4 -f image2 -ss 00:00:02 -vframes 1 -s 1920*1080 test.jpg