증상: 8K(7680x4320) HEVC 11분 6.76GB mp4 변환이 멈춤. 근본 원인 2가지: 1. mp4→mp4(같은 형식)이 그래프 self-edge 부재로 Skip 처리되고, QuickProgressWindow가 '전부 건너뜀' 종료 상태를 처리 안 해 멈춘 듯 보임. 2. 강제하던 h264_nvenc가 4096px 초과(8K)를 인코딩 못 해 즉시 실패 → CPU libx264 8K 폴백이 사실상 무한정 소요(진짜 멈춤). 수정: - FfmpegProvider: 해상도별 코덱 — videoWidth>4096(8K 등)은 hevc_nvenc(GPU) →libx265(CPU)로, 이하는 h264_nvenc→libx264. 코덱 강제는 mp4/mkv/mov에만 적용하고 webm/avi/gif는 컨테이너 기본 코덱(vp9 등) 유지. - FfmpegProvider: 비디오/오디오 동일포맷 self-edge 추가(mp4→mp4 등 재압축). gif는 제외 — 이미지로도 다뤄져 ffmpeg 미설치 시 Skip→하드실패 회귀 방지. - QuickProgressWindow.Finish: 성공·실패 없이 전부 건너뜀인 종료 상태를 명확히 안내. 검증: 실제 8K HEVC 클립으로 mp4→mp4 변환 → hevc_nvenc로 정상 인코딩, 28.3MB→2.1MB(93% 압축). 전체 38개 단위테스트 통과(적대적 리뷰 2건 반영). Package 1.0.3.0.
46 lines
2.1 KiB
C#
46 lines
2.1 KiB
C#
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using Everything2Everything.Core;
|
|
using Everything2Everything.Core.Converters;
|
|
using Everything2Everything.Core.Providers;
|
|
using Xunit;
|
|
|
|
namespace Everything2Everything.Tests;
|
|
|
|
public class FfmpegProviderTests
|
|
{
|
|
[Fact]
|
|
public async Task WithoutFfmpeg_IsNotReady()
|
|
{
|
|
// 테스트 환경에 ffmpeg가 없다고 가정. 있으면 이 단언은 건너뜀.
|
|
if (ExternalToolDetector.TryFindFfmpeg(out _)) return;
|
|
var p = new FfmpegProvider();
|
|
var a = await p.CheckAvailabilityAsync();
|
|
Assert.False(a.IsReady);
|
|
Assert.NotNull(a.Reason);
|
|
}
|
|
|
|
[Fact]
|
|
public void Graph_HasVideoAndAudioEdges()
|
|
{
|
|
var graph = Everything2EverythingBootstrap.CreateDefault().Providers.Graph;
|
|
Assert.NotNull(graph.FindBestPath(".mp4", ".webm")); // 영상 트랜스코딩
|
|
Assert.NotNull(graph.FindBestPath(".wav", ".mp3")); // 오디오 변환
|
|
Assert.NotNull(graph.FindBestPath(".mp4", ".mp3")); // 영상→오디오 추출
|
|
Assert.NotNull(graph.FindBestPath(".mp4", ".mp4")); // 동일 포맷 재인코딩(압축) self-edge
|
|
Assert.NotNull(graph.FindBestPath(".mp3", ".mp3")); // 동일 포맷 오디오 재인코딩 self-edge
|
|
}
|
|
|
|
[Fact]
|
|
public void Capability_DeclaresVideoAudioMatrix_WithReEncodeSelfPairs()
|
|
{
|
|
var caps = new FfmpegProvider().Capability.SupportedConversions;
|
|
Assert.Contains(caps, c => c.InputExtension == ".mp4" && c.OutputExtension == ".mkv");
|
|
Assert.Contains(caps, c => c.InputExtension == ".flac" && c.OutputExtension == ".mp3");
|
|
// 동일 포맷 재인코딩(압축) self-edge: 비디오 컨테이너·오디오는 self-pair를 허용한다.
|
|
Assert.Contains(caps, c => c.InputExtension == ".mp4" && c.OutputExtension == ".mp4");
|
|
Assert.Contains(caps, c => c.InputExtension == ".wav" && c.OutputExtension == ".wav");
|
|
// gif는 self-edge에서 제외 — 이미지로 다뤄지며 ffmpeg 미설치 시 회귀를 막기 위함.
|
|
Assert.DoesNotContain(caps, c => c.InputExtension == ".gif" && c.OutputExtension == ".gif");
|
|
}
|
|
}
|