步骤如下:
ffmpeg -i input.mp4 -c:v libx264 -preset slow -crf 23 -c:a aac -b:a 128k output.mp4
-c:v libx264
:指定H.264视频编码器。-preset slow
:平衡编码速度与压缩率(可选值:ultrafast, superfast, veryfast, fast, medium, slow等)。-crf 23
:恒定质量模式(CRF范围0-51,值越小质量越高,推荐18-28)。-c:a aac
:音频编码为AAC格式。-b:a 128k
:音频码率设为128kbps。 ffmpeg -i input.mp4 -vf "scale=1280:720" -c:v libx264 output.mp4
错误信息:
main.bash: line 1: ffmpeg: command not found (exit status 127)
ffmpeg -i input.mp4 -r 30 output.mp4 # 强制输出帧率为30fps
ffmpeg -i input.mp4 -g 60 -keyint_min 60 # 每60帧一个关键帧[[21]]
ffmpeg -i input.mp4 -c:v h264_nvenc -preset p7 -cq 21 output.mp4
3. 高级功能示例
ffmpeg -i input.mp4 -c:v rawvideo -pix_fmt yuv420p output.yuv
ffmpeg -i video.mp4 -i audio.wav -map 0:v -map 1:a -c copy output.mkv
avformat_alloc_output_context2(&fmt_ctx, NULL, NULL, output_file);
AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264);
AVCodecContext *codec_ctx = avcodec_alloc_context3(codec);
codec_ctx->width = 1280;
codec_ctx->height = 720;
codec_ctx->time_base = (AVRational){1, 25}; // 帧率25fps
codec_ctx->bit_rate = 4000000; // 码率4Mbps
codec_ctx->pix_fmt = AV_PIX_FMT_YUV420P;
avcodec_open2(codec_ctx, codec, NULL);
AVFrame *frame = av_frame_alloc();
AVPacket *pkt = av_packet_alloc();
while (/* 有数据输入 */) {
// 填充frame数据(如YUV像素)
avcodec_send_frame(codec_ctx, frame);
while (avcodec_receive_packet(codec_ctx, pkt) == 0) {
av_write_frame(fmt_ctx, pkt); // 写入封装层
}
}
av_write_trailer(fmt_ctx); // 写入文件尾部
avcodec_free_context(&codec_ctx);
```11115
---
### **三、关键参数详解**
1. **码率控制模式**
- **CRF模式**:质量优先(推荐视频存档)
- **CBR模式**:恒定码率(适合流媒体)
```bash
ffmpeg -i input.mp4 -b:v 2M -maxrate 2M -bufsize 4M output.mp4
编码预设(Preset)
-preset ultrafast
:编码速度最快,压缩率最低-preset veryslow
:编码速度最慢,压缩率最高Profile与Level
ffmpeg -i input.mp4 -profile:v high -level 4.1 # 支持高级特性(如B帧)[[21]]
找不到编码器
libx264
(H.264)、libvpx
(VP9)./configure --enable-libx264
时间戳错误
av_packet_rescale_ts(pkt, codec_ctx->time_base, stream->time_base)
内存泄漏
av_frame_free()
, av_packet_free()
需要注意不同版本的FFmpeg差异,比如av_register_all()在较新版本中已不再需要,因此需要确认当前日期是2025年,可能相关函数有所变化。根据(2025年)和(2023年),可能现在使用avcodec_send_frame和avcodec_receive_packet更常见。
视频二维码应用
热门原创推荐
AI工具类文章
视频加密/防下载/防录屏
FFmpeg视频编码
谷歌浏览器
ThinkPad电脑
视频直播