FFmpeg简单总结

news/2024/7/10 20:33:24 标签: 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。

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

简单的demo如下

#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;
}


http://www.niftyadmin.cn/n/5333232.html

相关文章

JAVA学习笔记——第三章 变量

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 变量 变量是程序的基本组成单位&#xff0c;是内存中的一个数据存储空间。变量有三个基本要素&#xff1a;类型名称值。变量的使…

使用muduo库编写网络server端

muduo库源码编译安装和环境搭建 C muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装-CSDN博客 #include<iostream> #include<muduo/net/TcpServer.h> #include<muduo/net/EventLoop.h> using namespace std; using namespace muduo; using name…

【从零开始学习Redis | 第七篇】利用Redis构造全局唯一ID(含其他构造方法)

目录 前言&#xff1a; 什么是全局唯一ID&#xff1f; 尝试构造全局唯一ID&#xff1a; 其他构造全局唯一ID的方法 1.基于数据库自增构造全局唯一ID&#xff1a; 2.基于UUID构造全局唯一ID&#xff1a; 3.基于雪花算法构造全局唯一ID&#xff1a; 总结&#xff1a; 前…

【计算机组成与体系结构Ⅱ】Cache性能分析(实验)

实验6&#xff1a;Cache性能分析 一、实验目的 1&#xff1a;加深对 Cache 的基本概念、基本组织结构以及基本工作原理的理解。 2&#xff1a;掌握 Cache 容量、相联度、块大小对 Cache 性能的影响。 3&#xff1a;掌握降低 Cache 不命中率的各种方法以及这些方法对提高 Ca…

ABeam×StartUp丨ABeam旗下德硕管理咨询(深圳)新创部门拜访「声扬科技」,解密声音的秘密

随着人工智能的快速发展&#xff0c;音频处理、语音分析、声纹识别等技术的应用也日益扩充至各个方面&#xff0c;这些技术不仅是前沿领域的高新科技&#xff0c;也与我们的生活息息相关。 近日&#xff0c;ABeam 旗下德硕管理咨询&#xff08;深圳&#xff09;有限公司&#…

如何批量修改文件名顺序编号?

如何批量修改文件名顺序编号&#xff1f;批量修改文件名顺序编号&#xff0c;指的是对多个文件名进行统一的修改&#xff0c;为每个文件名添加一个顺序编号。例如&#xff0c;将文件夹中的一组文件从"file1", "file2", "file3" 修改为 "001…

指令 - DarkVoxel Wiki

[首页] 在 高权限 下&#xff0c;出于游戏调试等原因&#xff0c;玩家可以使用指令 (Command)。 按 T 打开聊天栏&#xff0c;输入命令按下回车即可。 以下是指令指南。<尖括号>表示必填参数&#xff0c;[中括号]表示可选参数。 /cure 治愈玩家。/invun 打开/关闭无…

Spring MVC学习之——如何接收请求传过来的参数

Spring MVC接收请求的参数 Springmvc中&#xff0c;接收页面提交的数据是通过方法形参来接收&#xff1a; 处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参 springmvc接收的参数都是String类型&#xff0c;所以spirngmvc提供了很多converter&a…