diff --git a/internal/adapters/audio/ffmpeg.go b/internal/adapters/audio/ffmpeg.go index a78908a..b3e0051 100644 --- a/internal/adapters/audio/ffmpeg.go +++ b/internal/adapters/audio/ffmpeg.go @@ -47,11 +47,15 @@ func (f *FFmpeg) ToWAV(ctx context.Context, src, dst string) error { args = append(args, "-f", "wav", dst) cmd := exec.CommandContext(ctx, bin, args...) cmd.WaitDelay = killGrace - if out, err := cmd.CombinedOutput(); err != nil { + // Only a bounded head of ffmpeg's output is kept: a hostile file made it print ~0.4 + // bytes per input byte, all of which CombinedOutput would buffer and copy (#49). + out := &headWriter{max: maxStderr} + cmd.Stdout, cmd.Stderr = out, out + if err := cmd.Run(); err != nil { if ctxErr := ctx.Err(); ctxErr != nil { return fmt.Errorf("audio: ffmpeg: %w", ctxErr) } - return fmt.Errorf("audio: ffmpeg: %w: %s", err, strings.TrimSpace(string(out))) + return fmt.Errorf("audio: ffmpeg: %w: %s", err, strings.TrimSpace(out.buf.String())) } // A zero exit that wrote nothing is still a failure: never hand whisper a // missing file and let the error surface three layers later.