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)
相关推荐
VidDown21 小时前
自动给视频挑一张能看的封面:帧评分、构图与批量生成
python·ffmpeg·音视频·视频
可乐鸡翅yeah_2 天前
HLS 业务 Referer‑Policy 网页元标签引发播放异常排错
前端·javascript·网络·ffmpeg·php·音视频
开开心心就好3 天前
本地文件搜索工具推荐,占用小速度还快
智能手机·ffmpeg·ocr·word·音视频·网络攻击模型·安全架构
我科绝伦(Huanhuan Zhou)3 天前
oracle坏块导致备份不了
数据库·oracle·ffmpeg
RS迷途小书童3 天前
Python+FFmpeg提取大疆无人机MP4内嵌mov_text遥测SRT字幕并做完整性校验
python·ffmpeg·大疆·srt字幕·dji
开开心心就好3 天前
视频压缩工具推荐,画质效果很能打
智能手机·ffmpeg·ocr·word·排序算法·音视频·散列表
可乐鸡翅yeah_4 天前
业务中 M3U8 水印相关坑,硬水印和动态水印区别
前端·网络·数据库·ffmpeg·m3u8在线
redfred4 天前
HyperFrames 部署教程:5.6 万 Star 开源「写 HTML 出视频」框架,Windows 从零上手(CLI 三条命令 + 7 个避坑)
ffmpeg·开源·自动化·html·音视频
Arcai10244 天前
PostgreSQL数据备份和恢复完全指南
数据库·postgresql·ffmpeg·备份一体机·备份软件·smartstor·智备科技
可乐鸡翅yeah_4 天前
FFmpeg 生成 HLS 独立分片 independent‑segments 参数到底有什么用
javascript·ffmpeg·音视频·safari·m3u8