FFmpeg03:多媒体文件处理基础

日志系统

  • #include <libavutil/log.h>
  • av_log_set_level(AV_LOG_DEBUG)
  • av_log(NULL, AV_LOG_INFO, "...%s\n", op)

常用日志级别

AV_LOG_ERROR

AV_LOG_WARNING

AV_LOG_INFO

Demo

log.cpp

cpp 复制代码
#include <iostream>
extern "C" {
#include <libavutil/log.h>
}

int main() {
    // Set the log level to AV_LOG_DEBUG
    av_log_set_level(AV_LOG_DEBUG);

    // Log a message at the INFO level
    av_log(nullptr, AV_LOG_INFO, "This is an informational message.\n");

    // Log a message at the WARNING level
    av_log(nullptr, AV_LOG_WARNING, "This is a warning message.\n");

    // Log a message at the ERROR level
    av_log(nullptr, AV_LOG_ERROR, "This is an error message.\n");

    return 0;
}
shell 复制代码
clang++ log.cpp -o log $(pkg-config --cflags --libs libavutil)

文件的删除与重命名

cpp 复制代码
avpriv_io_delete()
avpriv_io_move()

操作目录

cpp 复制代码
avio_open_dir()
avio_read_dir()
avio_close_dir()

/* -------重要结构体----- */
AVIODirContext // 操作目录的上下文
AVIODirEntry // 目录项,用于存放文件名,文件大小等信息

Demo

实现ls命令

cpp 复制代码
#include <iostream>

extern "C" {
    #include <libavutil/log.h>
    #include <libavformat/avformat.h>
}

int main(void) {

    int ret;
    AVIODirContext *ctx = nullptr;
    AVIODirEntry *entry = nullptr;
    av_log_set_level(AV_LOG_INFO);

    ret = avio_open_dir(&ctx, "./", nullptr);
    if (ret < 0) {
        av_log(nullptr, AV_LOG_ERROR, "Could not open directory: %s\n", av_err2str(ret));
        return ret;
    }

    while (1) {
        ret = avio_read_dir(ctx, &entry);
        if (ret < 0) {
            av_log(nullptr, AV_LOG_ERROR, "Could not read directory: %s\n", av_err2str(ret));
            
            break;
        }
        if (!entry) {
            break; // No more entries
        }

        av_log(nullptr, AV_LOG_INFO, "%12"PRId64" %s\n", entry->size, entry->name);
        avio_free_directory_entry(&entry);
    }

    avio_close_dir(&ctx);
    return 0;
}
shell 复制代码
clang++ ffmpeg_ls.cpp -o ffmpeg_ls $(pkg-config --cflags --libs libavutil libavformat)

处理流数据的基本概念

  • 多媒体文件其实是个容器
  • 在容器里有很多流(Stream/Track)
  • 每种流是由不同的编码器编码的
  • 从流中读出的数据称为包
  • 在一个包中包含着一个或多个帧

几个重要的结构体

  • AVFormatContext
  • AVStream
  • AVPacket

操作流数据的基本步骤

解复用----> 获取流------>读数据包----->释放资源

打印音视频Meta信息

  • av_register_all (5.0以后就被取消了)
  • avformat_open_input() / avformat_close_input
  • av_dump_format()
cpp 复制代码
extern "C" {
#include <libavformat/avformat.h>
#include <libavutil/log.h>
}

int main() {
    int ret;
    AVFormatContext *fmt_ctx = nullptr;
    av_log_set_level(AV_LOG_INFO);
    
    // av_register_all(); ffmpeg 4.0 and later do not require this
    ret = avformat_open_input(&fmt_ctx, "./input.mp4", nullptr, nullptr);
    if (ret < 0) {
        av_log(nullptr, AV_LOG_ERROR, "Could not open input file: %s\n", av_err2str(ret));
        return ret;
    }

    av_dump_format(fmt_ctx, 0, "./input.mp4", 0);

    avformat_close_input(&fmt_ctx);

    return 0;
}
shell 复制代码
clang++ ffmpeg_meta.cpp -o mediainfo $(pkg-config --cflags --libs libavutil libavformat)
相关推荐
程序员老陆5 小时前
WHIP 与 WHEP:WebRTC 直播的标准化入口与出口
ffmpeg·音视频·webrtc·whip·whep
可乐鸡翅yeah_1 天前
混合内容 Mixed‑Content 安全策略,HLS HTTPS 页面加载 HTTP 资源排错实战
运维·ffmpeg·音视频·媒体·m3u8
刘广睿2 天前
视频导出为什么发灰?色彩空间与色彩范围(BT.601/709/2020)的 ffmpeg 转换实战
ffmpeg·音视频·视频处理·色彩空间·素材管理
yivifu2 天前
精选FFmpeg 实用音频视频转换命令集
ffmpeg·音视频转换
风哥2号6 天前
数据库教程FGMT02‑生产环境Linux+Oracle19c安装配置与项目实战
linux·数据库·ffmpeg
Bruce_Liuxiaowei6 天前
录屏片段无损合并:从 ffmpeg concat 原理到 Python 自动化脚本
python·ffmpeg·自动化
工具派8 天前
口播视频怎么自动剪掉冷场?视频静音删除的阈值实测
ffmpeg·音视频·视频
❀͜͡傀儡师8 天前
移动端 360° 商品展示方案:从 20MB 雪碧图到 800KB 丝滑视频
ffmpeg·webgl·sprite
2501_930472448 天前
深度复盘|数据库迁移实战(上):腾讯云助手解析慢查询日志,定位索引缺失与语法不兼容
数据库·阿里云·ffmpeg·云计算·腾讯云·aws
我就是DaLing呀!8 天前
flutter + ffmpeg_kit_extended_flutter 大视频合并下载
flutter·ffmpeg·音视频