FFmpeg简单总结

FFmpeg简介

FFmpeg(Fast Forward MPEG)是一个开源跨平台的音视频处理工具库和软件套件,它包括了一系列用于处理多媒体数据的程序和库。FFmpeg 提供了音视频编解码、封装、过滤、流媒体传输等功能,支持多种音频、视频和容器格式,包括但不限于 MP4、AVI、MKV、FLV、MP3、AAC、H.264、H.265 等。

官方文档:ffmpeg document

FFmpeg 可以在多个操作系统上运行,包括 Linux、Windows、macOS 等。

组成部分

  1. libavcodec: 提供了音视频编解码器的库。
  2. libavformat: 处理多媒体容器格式的库,包括封装和解封装。
  3. libavutil: 包含一些公共的实用工具函数。
  4. libswscale: 提供图像缩放和颜色转换功能的库。
  5. libavfilter: 实现音视频过滤器的库,用于进行各种音视频处理操作。
  6. ffmpeg: 命令行工具,用于进行音视频处理和转码。
  7. ffprobe: 用于检测多媒体文件信息的命令行工具。
  8. ffplay: 简单的播放器,支持音视频播放。

常用例子

1.转码视频为其他格式:将输入视频文件 input.mp4 转码为 H.264 视频编码和 AAC 音频编码的输出文件 output.mp4。

bash 复制代码
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4

2.提取视频中的音频:从输入视频文件 input.mp4 中提取音频并保存为 AAC 格式的文件 output_audio.aac。

bash 复制代码
ffmpeg -i input.mp4 -vn -c:a copy output_audio.aac

3.剪切视频:从输入视频文件 input.mp4 中剪切出从 1 分钟到 2 分钟 30 秒的部分,并保存为输出文件 output_cut.mp4。

bash 复制代码
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。

bash 复制代码
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。

bash 复制代码
ffmpeg -i input.mp4 -vf scale=640:480 -c:a copy output_resized.mp4

简单的demo如下

c 复制代码
#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;
}
相关推荐
daidaidaiyu6 小时前
FFmpeg 关键的结构体
c++·ffmpeg
扶尔魔ocy15 小时前
【QT window】ffmpeg实现录音功能之无损格式--PCM
ffmpeg·pcm
止礼16 小时前
FFmpeg8.0.1 源代码的深入分析
ffmpeg
小曾同学.com17 小时前
音视频中的“透传”与“DTS音频”
ffmpeg·音视频·透传·dts
vivo互联网技术17 小时前
数字人动画云端渲染方案
前端·ffmpeg·puppeteer·web3d
止礼18 小时前
FFmpeg8.0.1 编解码流程
ffmpeg
qs701619 小时前
c直接调用FFmpeg命令无法执行问题
c语言·开发语言·ffmpeg
止礼19 小时前
FFmpeg8.0.1 Mac环境 CMake本地调试配置
macos·ffmpeg
简鹿视频1 天前
视频转mp4格式具体作步骤
ffmpeg·php·音视频·实时音视频