영상 편집자라면 누구나 공감할 고통의 시간, 바로 '자막 작업'입니다. 특히 인터뷰 영상이나 여러 명이 대화하는 콘텐츠라면 그 고통은 배가 되죠. 프리미어 프로의 '텍스트 기반 편집(받아쓰기)' 기능이 등장하면서 1차 받아쓰기 작업은 정말 편해졌지만, 여전히 우리를 괴롭히는 마지막 관문이 있습니다.

바로 '화자별로 자막 분리하기' 입니다.

A가 말하는 부분, B가 말하는 부분을 일일이 잘라내고, 각기 다른 스타일을 적용하는 반복 작업. 자막 몇 개만 수정해도 싱크가 밀릴까 봐 노심초사했던 경험, 다들 한 번쯤은 있으실 겁니다.

"이 지루하고 반복적인 작업을 누군가 대신해 줄 순 없을까?"

 

이 고민에서 시작된 무료 웹툴, Talk2SRT를 소개합니다.

 

 

Talk2SRT가 해결해 주는 단 한 가지, 그러나 강력한 문제

Talk2SRT는 복잡한 기능을 가진 툴이 아닙니다. 딱 한 가지 문제에만 집중합니다.

"프리미어 프로에서 받아쓴 대본을 '화자별 SRT 자막'으로 즉시 분리해 주는 것"

쉽게 말해, 여러분이 프리미어 프로에서 내보낸 CSV 파일 두 개만 업로드하면, Talk2SRT가 알아서 "A 화자 자막.srt", "B 화자 자막.srt" 파일을 각각 만들어 드리는 겁니다.

어떻게 사용하나요? (3단계면 끝!)

사용법은 놀라울 정도로 간단합니다. 복잡한 설치나 회원가입도 필요 없습니다.

  1. 프리미어 프로에서 CSV 파일 2개 내보내기
    • 텍스트 패널에서 대본(화자 정보 포함) CSV 파일을 내보냅니다.
    • 같은 패널에서 캡션 CSV 파일을 내보냅니다.
  2. Talk2SRT에 파일 업로드
  3. 화자별 SRT 파일 다운로드
    • 업로드 즉시, 화자별로 완벽하게 분리된 SRT 자막 파일들이 담긴 ZIP 파일을 다운로드할 수 있습니다.

이제 이 SRT 파일들을 다시 프리미어 프로로 가져와 원하는 스타일을 입히기만 하면, 지루했던 자막 분리 작업이 순식간에 끝납니다.

이런 분들에게 강력 추천합니다!

✅ 2명 이상이 등장하는 인터뷰, 대담, 팟캐스트 영상을 자주 편집하시는 분
✅ 프리미어 프로의 '텍스트 기반 편집' 기능을 적극적으로 활용하시는 분
✅ 반복적인 자막 분리 작업에 소중한 편집 시간을 낭비하고 싶지 않으신 분
✅ 자막 작업의 효율을 극적으로 높이고 싶으신 모든 크리에이터 및 편집자

이제 자막 작업에 시간을 뺏기지 마세요

Talk2SRT는 영상 편집자들의 실제적인 고충을 해결하기 위해 만들어진 완전 무료 툴입니다. 반복적이고 소모적인 작업은 이제 툴에게 맡기고, 여러분은 더 창의적인 편집에 집중하세요.

지금 바로 아래 링크에서 여러분의 자막 작업 효율을 한 단계 업그레이드해 보세요!

➡️ Talk2SRT 바로 가기


 

 

🎯 이런 증상, 혹시 겪어보셨나요?

저희처럼 화면 녹화 영상 자주 편집하시는 분들 계실 거예요.
그런데 프리미어에서 영상만 불러오면…

  • 타임라인에서 영상이 반복되거나,
  • 재생 도중 특정 구간이 루프처럼 계속 돌아가고,
  • 심지어 소리랑 영상이 안 맞기도 해요.

영상 파일 자체는 멀쩡한데 프리미어에만 불러오면 이상하죠?
처음엔 버그인 줄 알았지만, 알고보니 “가변 프레임레이트(VFR)” 때문이었답니다.


🔍 원인: 가변 프레임레이트(VFR)?

녹화 프로그램들(OBS, Bandicam 등)은 대부분 ‘가변 프레임레이트(VFR)’ 방식으로 저장해요.
이건 상황에 따라 초당 프레임 수가 달라지는 건데요.

반면 프리미어는 ‘고정 프레임레이트(CFR)’에 최적화되어 있어서
가변 프레임 영상이 들어오면 호환 문제가 생기기 쉬워요.

그 결과…

  • 영상 끊김
  • 오디오 싱크 밀림
  • 재생 중 구간 반복

이런 문제들이 발생한답니다.


🛠️ 해결법: HandBrake로 CFR로 변환하기!

이럴 땐 무료 인코딩 툴 HandBrake를 쓰면 정말 간단하게 해결돼요.
과정도 어렵지 않아요!

✅ Step 1 : 영상 파일 불러오기

HandBrake 실행 후, 좌측 상단 ‘파일 열기’ 클릭!

✅ Step 2 : 프리셋 선택

우측에서 ‘Fast 1080p30’ 선택해 주세요.

✅ Step 3 : 비디오 설정

  • [비디오] 탭 클릭
  • 프레임레이트(FPS): 30
  • 아래 ‘일정한 프레임율 (Constant Framerate)’ 꼭 체크! ← 핵심포인트

✅ Step 4 : 저장 위치 선택

하단에서 저장 경로를 정해 주세요.

✅ Step 5 : ▶ 인코딩 시작

Start Encode 버튼 클릭하면 변환 시작돼요!


🎉 변환 후엔 이런 변화가 있어요!

HandBrake로 변환한 후 프리미어에 불러오면,

  • 영상 재생이 끊기거나 반복되지 않아요
  • 오디오 싱크도 딱 맞아요
  • 편집 작업이 훨씬 부드러워져요

🧠 추가 꿀팁

상황추천 설정
프리미어 재생 느릴 때 프로그램 모니터 해상도 1/2 또는 1/4로 낮추기
고화질 영상 편집 프록시 파일 생성해서 부드럽게 작업
더 최적화된 편집 HandBrake에서 ProRes, DNxHD 코덱으로 변환
 

✍️ 마무리하며

이번 문제는 프리미어의 오류가 아니라,
‘가변 프레임레이트’라는 구조적인 문제 때문이었어요.

처음 한 번만 HandBrake로 변환해두면,
그 다음부터는 훨씬 쾌적한 편집 환경이 기다리고 있답니다 😊

화면 녹화 편집 자주 하신다면,
이 방법 진짜 꼭 써보세요! 엄청 도움돼요👍


🔗 참고로 HandBrake는 여기서 받을 수 있어요:
👉 https://handbrake.fr


🎯 Experiencing These Issues?

If you're like us and often edit screen-recorded videos,
you might have run into this:

  • Footage repeats or loops in the timeline
  • Playback freezes or lags at certain points
  • Audio and video are out of sync

The file looks fine elsewhere, but in Premiere Pro? Total chaos.
At first, we thought it was a bug.
But actually, it’s caused by the video’s Variable Frame Rate (VFR).


🔍 Root Cause: Variable Frame Rate (VFR)

Most screen recording tools (like OBS or Bandicam) save videos using VFR.
That means the frame rate can fluctuate depending on what's happening onscreen.

But Premiere Pro works best with Constant Frame Rate (CFR) files.
When you import VFR videos, it can cause:

  • Playback loops
  • Audio sync issues
  • Choppy or laggy preview

🛠️ The Fix: Convert VFR to CFR Using HandBrake

HandBrake is a free open-source video encoder.
And it's super handy for fixing this exact issue.

✅ Step 1: Open the video

Launch HandBrake → Click "File" to import your video.

✅ Step 2: Choose a Preset

Select "Fast 1080p30" on the right-hand side.

✅ Step 3: Set Video Settings

  • Go to the Video tab
  • Set Frame Rate (FPS) to 30
  • Make sure to check “Constant Framerate”KEY STEP

✅ Step 4: Choose Save Location

Set your output path at the bottom.

✅ Step 5: Hit ▶ Start Encode

Click “Start Encode” and let it do its magic.


🎉 After the Conversion

Once you import the new file into Premiere:

  • No more looping or glitching
  • Smooth playback
  • Audio and video stay perfectly synced

🧠 Pro Tips

SituationSuggested Fix
Laggy playback in Premiere Set Program Monitor resolution to 1/2 or 1/4
Editing large 4K files Use proxy files for smoother editing
Better editing performance Convert to ProRes or DNxHD codec if needed
 

✍️ Final Thoughts

This isn’t a Premiere Pro bug—it’s a VFR compatibility issue.
Just one quick conversion through HandBrake,
and you’ll get buttery-smooth editing every time.

If you're working with screen recordings regularly,
this workflow is a game changer.


🔗 Download HandBrake here:
👉 https://handbrake.fr


 

안녕하세요! 웹 개발을 하다 보면 데스크탑에서는 멀쩡하던 UI가 모바일에서만 말썽을 부리는 경우가 종종 있죠. 저도 최근 Next.js와 Tailwind CSS로 웹툰 결과 페이지를 만들다가 말풍선 안의 텍스트가 모바일에서만 한쪽으로 쏠리는 현상을 겪었습니다. 브라우저 개발자 도구의 모바일 뷰에서는 괜찮았는데 말이죠!

오늘은 이 문제의 원인을 파악하고 해결하는 과정을 공유해 보려고 합니다.

처음에 내가 작성했던 코드 (문제 발생 코드)

먼저 문제가 발생했던 핵심 코드 일부를 살펴볼게요. 텍스트 위치와 내용을 webtoonTextMeta.ts에서 관리하고, WebtoonText.tsx 컴포넌트가 이를 렌더링하는 구조였습니다.

constants/bluemoonladysaju/webtoonTextMeta.ts (일부)

// ... (interface 정의 등) ...

export const webtoonTextMeta: WebtoonTextMeta = {
  IMG1_BUBBLE: {
    textTemplate: `이제 본격적으로 \n{{name}}님의 사주팔자를 \n분석해볼 차례네요.`,
    // top, left, bottom, right 중 일부를 사용해 위치 지정
    // 예시: IMG1_BUBBLE의 초기 설정 값
    // containerBottom: "6%",
    // containerLeft: "14%",
    // !! 중요: 이때 containerWidth가 정의되지 않았음 !!
    sort: "center", // 텍스트 중앙 정렬 의도
  },
  // ... 다른 텍스트 메타 정보 ...
};

components/UI/Webtoon/WebtoonText.tsx (핵심 로직 일부)

// ... (imports, props 정의 등) ...

export const WebtoonText = ({ /* ...props... */ }) => {
  // ... (변수 할당 로직) ...

  let style: React.CSSProperties = {};

  if (textKey) {
    const bubble = webtoonTextMeta[textKey];
    // ... (bubble 데이터 가져오기) ...

    const {
      // 메타데이터에서 위치 값들을 가져옴
      containerTop, containerLeft, containerBottom, containerRight, // 나중에 추가된 속성들
      top, left, bottom, right, // 초기에 사용하던 속성들
      // !! containerWidth를 가져오지만, webtoonTextMeta에 정의 안되어 있으면 undefined !!
      containerWidth,
      className: bubbleCls,
      sort: metaSort,
    } = bubble;

    // 💡 문제의 실마리 1: containerWidth가 없으면 style.width가 설정되지 않음!
    if (containerWidth) style.width = containerWidth;

    // 위치 설정 (top, left 우선)
    style.top = containerTop !== undefined ? containerTop : top;
    style.left = containerLeft !== undefined ? containerLeft : left;
    // ... (right, bottom 처리 로직) ...

    if (bubbleCls) {
      bubbleClassName = bubbleCls;
    }
  }

  // ... (텍스트 정렬 클래스 생성 로직) ...
  // 예: finalSort가 "center"면 textAlignClass = "text-center"

  // 💡 문제의 실마리 2: w-fit 이나 명시적 width 없이 absolute 사용
  // 초기 버전에서는 combinedClassName = `absolute w-fit ${...}` 였거나,
  // 이후 버전에서는 w-fit이 빠졌지만 style.width가 설정되지 않으면 비슷한 효과
  const combinedClassName = `absolute ${className} ${bubbleClassName} ${textAlignClass}`;

  return (
    <div className={combinedClassName} style={style}>
      {/* ... 텍스트 렌더링 ... */}
    </div>
  );
};

초기 문제 상황 요약:

  • WebtoonText를 감싸는 divposition: absolute; 입니다.
  • webtoonTextMeta에 말풍선 텍스트 컨테이너의 너비(containerWidth)가 명시적으로 정의되어 있지 않았습니다.
  • style.width가 설정되지 않은 absolute 요소는 기본적으로 내부 콘텐츠 크기만큼만 너비를 가집니다 (마치 w-fit을 사용한 것처럼).
  • 텍스트는 sort: "center" (즉, text-align: center)로 이 "내용물 크기만큼 변하는" 컨테이너 안에서 중앙 정렬되었습니다.
  • 컨테이너의 시작 위치는 containerLeft (또는 containerBottom 등)로 고정되어 있었습니다.

무엇이 문제였을까? "너비 없는 컨테이너"의 함정!

자, 여기서 핵심 문제가 발생합니다.

  1. 유동적인 컨테이너 너비: containerWidth가 없으니, 말풍선 텍스트를 담는 div의 너비는 텍스트 길이에 따라 고무줄처럼 늘어났다 줄어들었다 했습니다.
  2. 고정된 시작점, 늘어나는 방향: containerLeft: "14%"처럼 컨테이너의 왼쪽 시작점은 고정되어 있었습니다. 텍스트가 길어져서 컨테이너가 넓어져야 한다면? 컨테이너는 오른쪽으로만 쭉~ 늘어납니다.
  3. 쏠리는 착시: text-align: center는 분명히 텍스트를 "컨테이너 내부에서" 중앙 정렬 시킵니다. 하지만 컨테이너 자체가 오른쪽으로 길쭉하게 늘어나 버리니, 사용자가 보기에는 텍스트가 오른쪽으로 쏠린 것처럼 보이는 것이죠!

비유하자면:

  • 문제 상황: 한쪽 끝만 벽에 고정된 고무줄(너비가 유동적인 컨테이너) 위에 구슬(텍스트)을 올려놓고 "가운데 있어!"라고 하는 것과 같아요. 고무줄이 길어지면 구슬도 고정된 끝에서 점점 멀어지겠죠?

데스크탑 개발자 도구의 모바일 뷰에서는 이 미세한 너비 변화나 폰트 렌더링 차이가 실제 모바일 기기와 달라서 문제가 잘 드러나지 않았던 것입니다. (물론 viewport 메타 태그 설정도 중요한 기본이지만, 이 경우는 너비 설정이 더 직접적인 원인이었습니다.)

해결책: 컨테이너에 "확실한 너비"를 주자!

해결책은 간단했습니다. 말풍선 텍스트를 담을 컨테이너에 명시적인 너비(containerWidth)를 설정해주는 것이었죠.

constants/bluemoonladysaju/webtoonTextMeta.ts (수정 후)

// ... (interface 정의 등) ...

export const webtoonTextMeta: WebtoonTextMeta = {
  IMG1_BUBBLE: {
    textTemplate: `이제 본격적으로 \n{{name}}님의 사주팔자를 \n분석해볼 차례네요.`,
    containerBottom: "6%",
    containerLeft: "14%",
    containerWidth: "70%", // ✨ 해결의 열쇠! 명시적인 너비 설정 ✨
    sort: "center",
  },
  IMG3_BUBBLE: {
    textTemplate: `제가 {{name}}님의 사주를\n보기 쉽게 표로 정리했어요`,
    containerTop: "12%",
    containerLeft: "11%",
    containerWidth: "75%", // ✨ 여기도 너비 설정! ✨
    sort: "center",
  },
  // ...
};

WebtoonText.tsx 컴포넌트는 이전 코드에서 if (containerWidth) style.width = containerWidth; 부분이 이미 있었기 때문에, webtoonTextMeta.ts 파일만 수정해도 style.width가 올바르게 적용됩니다.

왜 해결되었을까요?

  1. 고정된 컨테이너 너비: 이제 containerWidth: "70%" (예시)처럼 설정해주니, 말풍선 텍스트를 담는 div는 부모 요소 너비의 70%라는 고정된 너비를 갖게 됩니다.
  2. 예측 가능한 정렬: text-align: center는 이 "너비가 고정된" 컨테이너 안에서 텍스트를 정확하게 중앙으로 정렬합니다. 컨테이너 자체가 한쪽으로 늘어나지 않으니 텍스트가 쏠려 보일 일도 없습니다.

비유하자면:

  • 해결된 상황: 길이가 정해진 나무판자(너비가 고정된 컨테이너)를 벽의 특정 위치에 단단히 고정하고, 그 위에 구슬(텍스트)을 놓으니 항상 가운데에 잘 있는 것과 같습니다.

추가적으로 확인했던 사항들 (좋은 습관!)

  • viewport 메타 태그: HTML <head><meta name="viewport" content="width=device-width, initial-scale=1.0"> 설정은 모바일 웹 개발의 기본 중의 기본이죠. 꼭 확인해야 합니다! (Next.js의 경우 pages/_document.tsx 또는 app/layout.tsx에서 설정)
  • 실제 기기 디버깅: 브라우저 개발자 도구만 믿지 말고, 실제 모바일 기기를 연결해서 디버깅(Chrome DevTools, Safari Web Inspector)하는 것이 가장 확실합니다.

마무리

CSS 레이아웃, 특히 position: absolute를 사용할 때는 요소의 크기(너비, 높이)를 명확히 지정하는 것이 얼마나 중요한지 다시 한번 깨닫게 된 경험이었습니다. 혹시 비슷한 문제를 겪고 계신 분이 있다면, 가장 먼저 요소의 너비가 제대로 설정되어 있는지 확인해보시길 바랍니다!

오늘의 삽질(?) 기록이 여러분께 조금이나마 도움이 되었으면 좋겠습니다. 즐거운 코딩 하세요!

+ Recent posts