前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >获取ffmpeg转码的实时进度

获取ffmpeg转码的实时进度

作者头像
Gnep@97
发布2024-01-12 08:46:40
4540
发布2024-01-12 08:46:40
举报

前言

本文记录查看 ffmpeg 进行转码时的实时进度。所用的工程基于上个博客编译成功的工程:使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c

一、需求

使用 ffmepg 对音视频文件进行转码的时候可以看到其详细的进度。

编译源程序,原来的程序执行下面的命令:

代码语言:javascript
复制
.\ffmpeg431_test.exe - i "SampleVideo_1280x720_20mb.mp4" - vcodec libx264 - acodec copy - y SampleVideo_1280x720_20mb.flv

可以看到下面的相关信息:

在这里插入图片描述
在这里插入图片描述

但是我们看不到还有多久可以转码结束,以及当前已完成的进度为整体的多少。

二、实现获取 ffmpeg 转码的实时进度

1、思路梳理

  • ffmpeg_parse_options() 函数用来实现解析参数,并且打开输入输出文件功能,当打开输入文件时就可以从其中获取到音视频总时长,因此修改其内部的 open_input_file() 函数,其内部的 avformat_open_input() 执行后可以得到输入的音视频总时长,因此我们在这里获取音视频总时长;
  • transcode() 函数内部的 print_report() 函数中有实现打印当前转码的显示时间戳,因此我们在这里获取当前转码的显示时间戳;
  • 将当前转码的显示时间戳除以音视频总时长即可得到 ffmpeg 转码的实时进度。

2、源码修改

①、在 ffmepg.h 文件里新增两个全局变量和一个声明一个获取实时的转码进度函数

代码语言:javascript
复制
int64_t __g_total_duration; // 音视频总时长
int64_t __g_tc_cur_pts;     // 当前转码的显示时间戳
double get_tc_progress();   // 获取实时的转码进度
在这里插入图片描述
在这里插入图片描述

②、在 ffmepg.c 文件中进行 获取实时的转码进度实现

代码语言:javascript
复制
// 获取实时的转码进度
double get_tc_progress() {
    if (__g_total_duration <= 0) 
        return 0;

    printf("&&& duration=%lld, pts = %lld &&&\n", __g_total_duration, __g_tc_cur_pts);
    printf("***progress = %lf***\n", (double)__g_tc_cur_pts / (double)__g_total_duration);

    return (double)__g_tc_cur_pts / (double)__g_total_duration;
}
在这里插入图片描述
在这里插入图片描述

③、在 ffmpeg_opt.c 文件中的 open_input_file 函数增加获取总时长的实现

代码语言:javascript
复制
    // by lp,获取总时长,微秒转毫秒
    __g_total_duration = ic->duration / 1000;
在这里插入图片描述
在这里插入图片描述

④、在 print_report 函数增加获取当前转码的显示时间戳,如果是最后一次打印报告则将音视频总时长赋值给当前转码的显示时间戳

代码语言:javascript
复制
    // by lp
    __g_tc_cur_pts = pts / 1000;    // 微秒转毫秒
    if (is_last_report) {
        __g_tc_cur_pts = __g_total_duration;
    }
    get_tc_progress();
在这里插入图片描述
在这里插入图片描述

⑤、主函数如下

代码语言:javascript
复制
// ffmpeg431_test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
extern "C"
{
#include "ffmpeg.h"
}

int main(int argc, char** argv)
{
	main_ffmpeg431(argc, argv);

	//printf("hello, ffmepg4.3.1\n");
	//char* arrParams[10] = { 0 };
	//for (int k = 0; k < 10; k++) {
	//	arrParams[k] = new char[64]();
	//}
	//strcpy(arrParams[0], "D:\\Project\\VS_Project\\ffmpeg431_test\\Debug\\ffmpeg431_test.exe");
	//strcpy(arrParams[1], "-i");
	//strcpy(arrParams[2], "\"SampleVideo_1280x720_20mb.mp4\"");
	//strcpy(arrParams[3], "-vcodec");
	//strcpy(arrParams[4], "libx264");
	//strcpy(arrParams[5], "-acodec");
	//strcpy(arrParams[6], "copy");
	//strcpy(arrParams[7], "-y");
	//strcpy(arrParams[8], "\"SampleVideo_1280x720_20mb.flv\"");

	//main_ffmpeg431(9, arrParams);

	//AVGeneralMediaInfo* avmi = new AVGeneralMediaInfo();
	//if (avmi) {
	//	get_avgeneral_mediainfo(avmi, "SampleVideo_1280x720_20mb.mp4");

	//	delete avmi;
	//	avmi = NULL;
	//}
}

三、运行结果

可以看到我们新增的打印信息,并且可以看到转换的进度

在这里插入图片描述
在这里插入图片描述

最后一次转换后的进度为 1,即 100%,完成了转码

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、需求
  • 二、实现获取 ffmpeg 转码的实时进度
    • 1、思路梳理
      • 2、源码修改
      • 三、运行结果
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档