ffmpeg libx264_在 FFMPEG 使用 VMAF

该博客介绍了如何利用Netflix的VMAF工具来评估视频转码质量。通过FFmpeg和libvmaf的安装及配置,读者可以学会如何在转码过程中获取最佳编码设置,以提高视频质量评分。文章提供了详细的安装和测试步骤,包括FFmpeg的编译以及使用VMAF进行视频质量比较的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《VMAF 视频质量评估工具概述》 中对 Netflix 开源的视频质量评估工具有一个简单的介绍。

如果我们需要了解一个视频在转码过程中怎样的编码配置会产出最好的结果,我们需要尽可能获得一个比较高的分数 (0-100)。

安装

如果你之前没有安装 FFmpeg ,你可以先安装 FFmpeg;

brew install ffmpeg

最新的版本已经默认启用 libvmaf 所以,你这样直接安装就好。如果想要自己构建的话,继续阅读下文。

我们要启用 libvmaf, 我们先 clone vmaf 项目。

git clone https://github.com/Netflix/vmaf.git

然后进入 ./libvmaf 目录,我们要 build libvmaf 。

meson build --buildtype release

ninja -vC build

我们需要配置 ffmepg;

git clone https://github.com/FFmpeg/FFmpeg.git

# 进入目录 

./configure --enable-libvmaf --enable-version3 --prefix=/usr/local --enable-gpl --enable-nonfree --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libopus --enable-libxvid --enable-libaom --disable-x86asm --samples=fate-suite/ 

make
make install

如果提示 :

libvmaf >= 1.3.9 not found using pkg-config

你可以绕开 pkg-config 直接 brew install libvmaf 的问题。

测试

ffmpeg -i 1.mp4 -i 0.mp4 -filter_complex "[0:v]scale=640x480:flags=bicubic[main];[main][1:v]libvmaf" -f null -

大致含义是我们参考 0.mp4 去对比 1.mp4 的分数

大致结果是:

Start calculating VMAF score...
frame= 3283 fps=107 q=-0.0 Lsize=N/A time=00:00:54.71 bitrate=N/A speed=1.78x
video:1718kB audio:9412kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Exec FPS: 105.077680
VMAF score = 37.661548
[libvmaf @ 0x7fbb6b30b4c0] VMAF score: 37.661548

扩展阅读

  • Run VMAF Library in FFMPEG
  • CompilationGuide/macOS
  • 11.111 libvmaf
你可以按照以下步骤使用`ff_libx264_encoder`: 1. 首先,确保你已经安装了`ffmpeg`工具,因为`ff_libx264_encoder`是`ffmpeg`库的一部分。 2. 在程序中引入相关的头文件: ```c #include <libavcodec/avcodec.h> ``` 3. 初始化`ffmpeg`库: ```c av_register_all(); ``` 4. 创建编码器上下文和输出文件: ```c AVCodecContext *codec_ctx; AVCodec *codec; AVFrame *frame; AVPacket pkt; FILE *output_file; const char *filename = "output.mp4"; // 查找编码器 codec = avcodec_find_encoder_by_name("libx264"); if (!codec) { // 错误处理 } // 创建编码器上下文 codec_ctx = avcodec_alloc_context3(codec); if (!codec_ctx) { // 错误处理 } // 配置编码器参数 codec_ctx->width = width; // 视频宽度 codec_ctx->height = height; // 视频高度 // ... // 打开编码器 if (avcodec_open2(codec_ctx, codec, NULL) < 0) { // 错误处理 } // 创建输出文件 output_file = fopen(filename, "wb"); if (!output_file) { // 错误处理 } ``` 5. 分配和初始化帧数据: ```c frame = av_frame_alloc(); if (!frame) { // 错误处理 } // 设置帧参数 frame->format = codec_ctx->pix_fmt; frame->width = codec_ctx->width; frame->height = codec_ctx->height; // 分配帧数据缓冲区 int ret = av_frame_get_buffer(frame, 0); if (ret < 0) { // 错误处理 } ``` 6. 循环编码每一帧: ```c while (/* 读取下一帧图像 */) { // 将图像数据拷贝到帧数据缓冲区 // ... // 发送帧数据到编码器 ret = avcodec_send_frame(codec_ctx, frame); if (ret < 0) { // 错误处理 } // 接收编码后的数据包 while (ret >= 0) { ret = avcodec_receive_packet(codec_ctx, &pkt); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) { // 继续下一帧 break; } else if (ret < 0) { // 错误处理 } // 写入编码后的数据到文件 fwrite(pkt.data, 1, pkt.size, output_file); // 释放数据包 av_packet_unref(&pkt); } } ``` 7. 编码完成后,进行清理工作: ```c av_frame_free(&frame); avcodec_close(codec_ctx); avcodec_free_context(&codec_ctx); fclose(output_file); ``` 这是一个基本的使用示例,具体的步骤和参数可能需要根据你的实际需求进行调整。每一步都需要进行错误处理,以确保程序的稳定运行。请参考`ffmpeg`官方文档和示例代码获取更多详细信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值