
답변1
ffmpeg는 AAC 스트림을 로드할 때 패딩을 위해 내부적으로 "프라이밍 샘플"이라고 불리는 추가 2프레임의 무음 프레임을 추가합니다. 0.2322의 인포인트를 추가하라는 위의 설명은 특정 샘플 속도에 대해 정확하지만 완벽하게 매끄럽게 하려면 더 많은 작업이 필요합니다.
간격 없이 원활하게 연결하려면 다음을 수행할 수 있습니다.
- 샘플 속도를 기준으로 AAC 프레임 길이를 계산합니다(예: 44.1KHz의 경우 1024/44100 = 0.02321995).
- 각 세그먼트의 시작과 끝 부분에 추가로 2개의 AAC 프레임을 인코딩합니다.
- ffmpeg가 항상 내부적으로 추가하는 2개의 자동 패딩 프레임을 고려하세요.
- 출력 파일을 생성할 때 "좋은" 콘텐츠만 사용되도록 concat txt 파일에 inpoint 및 outpoint 지시문을 할당합니다.
각 AAC 프레임은 이전 최대 2개의 프레임에 종속되므로 2개의 추가 시작 프레임이 필요합니다. 따라서 첫 번째 프레임을 올바르게 인코딩하려면 해당 컨텍스트가 필요합니다. ffmpeg는 갑작스러운 팝을 피하기 위해 끝 부분에서 오디오를 테이퍼하기 때문에 끝에 2개의 추가 프레임이 필요합니다. 2개의 추가 프레임을 추가함으로써 실제 콘텐츠에 영향을 주지 않도록 테이퍼를 이동합니다. 그런 다음 이러한 추가 프레임은 반복되는 콘텐츠를 피하기 위해 인포인트 및 아웃포인트를 사용하여 제거됩니다.
이 방법을 사용하면 모든 세그먼트의 길이가 AAC 프레임 기간의 정확한 배수인 것이 중요합니다. 그렇지 않으면 세그먼트 경계에 예측할 수 없는 아티팩트가 표시됩니다.
나는 최근에 실제 코드로 이를 더 자세히 보여주는 저장소를 출시했습니다.https://github.com/wistia/seamless-aac-split-and-stitch-demo.