FFmpeg(Fast Forward MPEG)是一个开源跨平台的音视频处理工具库和软件套件,它包括了一系列用于处理多媒体数据的程序和库。FFmpeg 提供了音视频编解码、封装、过滤、流媒体传输等功能,支持多种音频、视频和容器格式,包括但不限于 MP4、AVI、MKV、FLV、MP3、AAC、H.264、H.265 等。
官方文档:ffmpeg document
FFmpeg 可以在多个操作系统上运行,包括 Linux、Windows、macOS 等。
1.转码视频为其他格式:将输入视频文件 input.mp4 转码为 H.264 视频编码和 AAC 音频编码的输出文件 output.mp4。
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4
2.提取视频中的音频:从输入视频文件 input.mp4 中提取音频并保存为 AAC 格式的文件 output_audio.aac。
ffmpeg -i input.mp4 -vn -c:a copy output_audio.aac
3.剪切视频:从输入视频文件 input.mp4 中剪切出从 1 分钟到 2 分钟 30 秒的部分,并保存为输出文件 output_cut.mp4。
ffmpeg -i input.mp4 -ss 00:01:00 -to 00:02:30 -c:v copy -c:a copy output_cut.mp4
4.合并视频和音频:将输入视频文件 video.mp4 和音频文件 audio.mp3 合并为一个输出文件 output_combined.mp4。
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -strict experimental output_combined.mp4
5.调整视频分辨率:将输入视频文件 input.mp4 调整分辨率为 640x480 并保存为输出文件 output_resized.mp4。
ffmpeg -i input.mp4 -vf scale=640:480 -c:a copy output_resized.mp4
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/opt.h>
#include <libswresample/swresample.h>
}
// 以下是简化的代码,可能需要根据实际需求进行扩展和改进
int main() {
// 初始化 FFmpeg 库
av_register_all();
avformat_network_init();
// 打开输入文件(可替换为摄像头等设备)
AVFormatContext *inputFormatContext = NULL;
if (avformat_open_input(&inputFormatContext, "input.mp4", NULL, NULL) < 0) {
fprintf(stderr, "Error opening input file\n");
return -1;
}
// 打开输出文件(可替换为网络传输等)
AVFormatContext *outputFormatContext = NULL;
if (avformat_alloc_output_context2(&outputFormatContext, NULL, "flv", "output.flv") < 0) {
fprintf(stderr, "Error creating output file\n");
return -1;
}
// 配置输出编码器(可根据需要选择不同的编码器)
AVCodec *outputCodec = avcodec_find_encoder(AV_CODEC_ID_H264);
if (!outputCodec) {
fprintf(stderr, "Error finding output encoder\n");
return -1;
}
AVStream *outputStream = avformat_new_stream(outputFormatContext, outputCodec);
if (!outputStream) {
fprintf(stderr, "Error creating output stream\n");
return -1;
}
AVCodecContext *outputCodecContext = outputStream->codec;
// 设置输出编码器参数(根据需要进行调整)
outputCodecContext->bit_rate = 400000;
outputCodecContext->width = 640;
outputCodecContext->height = 480;
outputCodecContext->time_base = (AVRational){1, 25};
outputCodecContext->framerate = (AVRational){25, 1};
// 打开输出编码器
if (avcodec_open2(outputCodecContext, outputCodec, NULL) < 0) {
fprintf(stderr, "Error opening output codec\n");
return -1;
}
// 分配编码缓冲区
AVFrame *frame = av_frame_alloc();
AVPacket *packet = av_packet_alloc();
// 处理音视频帧(根据实际需求进行处理)
// 编码音视频帧
if (avcodec_send_frame(outputCodecContext, frame) < 0 || avcodec_receive_packet(outputCodecContext, packet) < 0) {
fprintf(stderr, "Error encoding frame\n");
return -1;
}
// 处理加密和解密(根据实际需求进行处理)
// 处理网络传输或其他输出方式(根据实际需求进行处理)
// 释放资源
av_frame_free(&frame);
av_packet_free(&packet);
avcodec_close(outputCodecContext);
avformat_close_input(&inputFormatContext);
avformat_free_context(outputFormatContext);
return 0;
}