Посмотреть запись этой статьи ffmpeg Ход транскодирования в реальном времени。Используемый проект основан на предыдущем блоге.компилироватьуспешный проект:Скомпилируйте ffmpeg.c, используя официальный пакет разработки SDK FFmpeg4.3.1.
При использовании ffmepg для перекодирования аудио и видео файлов вы можете увидеть подробный прогресс.
Скомпилируйте исходную программу. Исходная программа выполняет следующую команду:
.\ffmpeg431_test.exe - i "SampleVideo_1280x720_20mb.mp4" - vcodec libx264 - acodec copy - y SampleVideo_1280x720_20mb.flv
Вы можете увидеть следующую соответствующую информацию:
Но мы не можем видеть, сколько времени потребуется для завершения перекодирования и какой прогресс уже достигнут.
① Добавьте две глобальные переменные и объявление, чтобы получить функцию прогресса транскодирования в реальном времени в файле ffmepg.h.
int64_t __g_total_duration; // Аудио и общая продолжительность видео
int64_t __g_tc_cur_pts; // Отображение временной метки текущего транскодирования
double get_tc_progress(); // Получайте информацию о ходе транскодирования в реальном времени
② Получайте информацию о ходе транскодирования в файле ffmepg.c в реальном времени.
// Получайте информацию о ходе транскодирования в реальном времени
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;
}
③ Добавить реализацию получения общей продолжительности в функции open_input_file в файле ffmpeg_opt.c.
// by lp, получите общую продолжительность, от микросекунд до миллисекунд
__g_total_duration = ic->duration / 1000;
④ Добавьте функцию print_report для получения временной метки отображения текущего транскодирования. Если это последний отчет о печати, назначьте общую продолжительность аудио и видео временной метке отображения текущего перекодирования.
// by lp
__g_tc_cur_pts = pts / 1000; // Микросекунды в миллисекунды
if (is_last_report) {
__g_tc_cur_pts = __g_total_duration;
}
get_tc_progress();
⑤ Основная функция заключается в следующем.
// 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 %, и перекодирование завершено.