FFmpeg 初级开发内容

ffmpeg primary

FFmpeg 日志的使用及目录操作

开启日志

  • #include <libavutil/log.h>

  • 设置日志级别
    avi_log_set_level(AV_LOG_DEBUG)
    常见日志级别:
    AV_LOG_ERROR
    AV_LOG_WARNING
    AV_LOG_INFO
    AV_LOG_DEBUG

  • av_log(NULL,AV_LOG_INFO,”…%s\n”, op)

操作文件

  • #include <libavformat/avformat.h>
    指定库文件位置: pkg-config –libs libavformat

  • 删除
    avpriv_io_delete(“1.txt”);

  • 重命名
    avpriv_io_move(“111.txt”, “222.txt”);

操作目录

  • #include <libavformat/avformat.h>

  • 打开目录
    avio_open_dir()


  • avio_read_dir()

  • 关闭
    avio_close_dir()

  • 重要结构体
    操作目录的上下文 AVIODirContext
    目录项 AVIODirEntry

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <libavutil/log.h>
#include <libavformat/avformat.h>

int main(int argc, char *argv[]) {
av_log_set_level(AV_LOG_INFO);

int ret;

//操作目录
AVIODirContext *ctx = NULL;
AVIODirEntry *entry = NULL;
ret = avio_open_dir(&ctx, "./", NULL);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cant open dir:%s\n", av_err2str(ret));
return -1;
}
while(1) {
ret = avio_read_dir(ctx, &entry);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Cant read dir:%s.\n", av_err2str(ret));
//报错后,跳转到__fail 标记,释放 ctx
goto __fail;
}
if (!entry) {
break;
}
av_log(NULL, AV_LOG_INFO, "%12"PRId64" %s \n", entry->size, entry->name);
//释放 entry
avio_free_directory_entry(&entry);
}
__fail;
avio_close_dir(&ctx);

// move rename
ret = avpriv_io_move("111.txt", "222.txt");
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Failed to rename.\n");
return -1;
}
av_log(NULL, AV_LOG_INFO, "Success to rename.\n");

// delete
ret = avpriv_io_delete("./222.txt");
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Failed to delete.\n");
return -1;
}
av_log(NULL, AV_LOG_INFO, "Success to delete.\n");

return 0;
}

FFmpeg 基本概念以及常用结构体

  • 概念
    多媒体文件本质是一个容器
    在容器里有很多流(Stream/Track)
    每种流是由不同的编码器编码的
    从流中读取的数据,称为包
    在一个包中包含着一个或多个帧,包是压缩后的数据

  • 常用结构体
    AVFormatContext
    AVStream
    AVPacket

  • FFmpeg 操作流数据的基本步骤
    解复用 –> 获取流 –> 读取数据包 –> 操作 –> 释放资源

对复用/解复用及流操作的各种实践

  • 打印音视频信息(meta)

FFmpeg 代码结构

FFmpeg-代码结构

作者

Wiley

发布于

2019-06-28

更新于

2024-05-26

许可协议