[2023 03 10] 목소리 더빙, 보이스 도와주는 프로그램 개발 연습 일지 (17-1) - 다 채널을 고려한 방식 전체 변경 - Whitmem
[2023 03 10] 목소리 더빙, 보이스 도와주는 프로그램 개발 연습 일지 (17-1) - 다 채널을 고려한 방식 전체 변경
Develop History
2023-03-09 10:44 게시 e60680010d3aac76f712

0
0
102
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
문제점
기존 방식에 대하여 채널이 다른 wav 파일의 로드시 사용자가 정의할 수 없다는 문제 발생
변경 방법
오디오 채널에 대하여 좌, 우 고정하지 아니하고 인덱스로 구성함으로써 사용자가 맵핑할 수 있도록 처리
변경 사항
자세한 변경 사항을 클래스별로 나열합니다.
SoundVObject
단일 오디오 오브젝트를 나타내는 클래스임
변경 사항 없음
MonoAudioStream
단일 오디오 스트림을 보관하는 클래스임
1. PCM 데이터가 아닌 파형 double[] 데이터를 보관함
2. 라우트 코드를 지정할 수 있음
라우트 코드는 맵핑 될 대상 코드 명이며, 사용자가 정의할 수 있음. 단 오디오 원본 wav 에 대한 MonoAudioStream에는 라우트코드가 의미가 없으며 사용자가 프로젝트에 Object를 추가하면서 정의한 라우트코드가 이 클래스의 라우트코드에 자동 맵핑됨
자세한 건 AudioBufferData가 대리함
AudioPackage
여러 채널의 모노 스트림을 같이 포함하고 있는 하나의 오디오 패키지임
1. getSampleRate() 시 MonoAudioStream 를 통해서 샘플 레이트를 가져옴
2. ChannelCount 로, 채널의 개수를 입력 받아 개수만큼 인덱스를 관리함
AudioStream
하나의 오디오 개체에 대한 오디오 로드를 관리하거나 시스템 오디오를 처리하는 클래스임
이 객체안에 AudioPackage가 파일로부터 동적 로드되거나 메모리상에 로드됨
1. 필요 없는 메소드 제거
2. 시스템에서 생성한 오디오 스트림의 경우 길이를 확인할 수 없도록 변경 (별도로 정의한 경우는 가능)
AudioBufferData
하나의 오디오 wav에 대해 작은 변경 사항에 대해 실시간으로 렌더링하고 라우트할 수 있도록 함
1. 라우트 보관 (중요)
2. requestAudioPackage() 요청을 보내면 만들어주는 오디오 패키지에 자신이 가 지고 있는 라우트 정보를 MonoAudioStream에 반영하여 반환함
3. 라우트 정보는 사용자가 지정하는 것임
AudioMonoMixHelper
오디오 패키지에 존재하는 모든 스트림을 단일 모노로 합성
1. 오디오는 평균 덧셈으로 처리하지 않으며, 단순 덧셈으로 처리함
2. 모든 스트림을 더하도록 처리
AudioMonoRouteHelper
특정 스트림 인덱스의 스트림을 모노 스트림으로 대체함
1. 좌, 우 지정이 아닌 스트림 인덱스 직접 지정으로 변경
AudioPackTimeCutHelper
오디오패키지를 전체적으로 길이를 자르고 새 패키지로 만들어 줌
1. 좌, 우 지정이 아닌 전체 스트림 개수를 복제함
2. 복제된 스트림의 길이 및 시작 시간을 조절함
3. 여기서 생성되는 모노 오디오 스트림은 라우트 코드를 가지고 있지 않음 (사용자가 정의할 필요가 있음)
예를 들어, AudioBufferDataAudioPackTimeeCutHelper로 자르고 난 뒤에 오디오 라우트 코드를 적용함
AudioStereoStrechHelper
특정 단일 인덱스 스트림을 원하는 개수만큼 가지고 있는 스트림 오디오 패키지로 복제 및 확장함
1. 모노 -> 스테레오가 아닌, 원하는 인덱스 스트림 -> 개수 복사로 변경
2. 여기서 생성되는 모노 오디오 스트림은 라우트 코드를 가지고 있지 않음 (사용자가 정의할 필요가 있음)
MonoStreamSumMixHelper
MonoAudioStream 을 모두 합쳐 반환함
1. SampleRate 를 직접 인자로 받도록 함
2. 평균 나눗셈 처리를 하지 않음
3. AudioMonoMixHelper 는 이 클래스에 의해 처리 됨
AudioMonoMixHelperAudioPackage 단위이며 이 패키지는 MonoAudioStream 단위 임
VObjectSoundStreamMixHelper
두 개 이상의 SoundObject를 무조건 합쳐 하나의 AudioPackage를 반환
1. 코드 별로 합성 진행
2. 합성된 코드가 여러 개 인경우 여러개의 코드가 채널로 만들어지며 생성됨
예를 들어 2개의 오브젝트가 있을 때, 첫 번째 오브젝트는 {LEFT, RIGHT} 채널이 존재, 두 번째 오브젝트는 {LEFT, RIGHT, CENTER} 채널이 존재하는 WAV 오브젝트라면 이 처리자에 의해 합성되는 경우 {LEFT, RIGHT, CENTER} 이라는 새로운 AudioPackage가 만들어짐 이 때 코드 역시 각각 LEFT, RIGHT, CENTER 로 그대로 유지됨
VTrackCompressor
여러개의 Track을 하나로 압축 해 줌
여러개의 트랙에서 겹치는 Object끼리 먼저 Mix 연산을 할 수 있도록 도와주며, 하나의 트랙에 여러개의 오브젝트가 존재하는 형태로 변환함
1. Wrapper 및 인자 값에 맞도록 수정
VTrackRenderer
하나의 VTrack을 오디오로 렌더링함
1. Wrapper 및 인자 값에 맞도록 수정
남은 문제점
1. 오디오 맵핑 부분이 정상 동작할지 확인 필요
2. 현재 한 wav에 대해서 한 채널에 대해 여러 채널에 동시 재생 불가 (예로 모노 wav에 대해서 좌우 복제 불가, 사용자가 지정하는 경우 하나의 채널에만 라우트 가능한데, 이 부분은 사용자가 직접 Object를 2개 만들거나, 오디오 스트림 설정에서 복제모드로 새로운 버퍼를 만들 수 있도록 구성하는 것이 좋아보임
3. 프로젝트 생성시 sampleRate 정보 받아야 함
4. 프로젝트 생성시 오디오 출력 채널 개수 정보 받아야 함
5. 프로젝트 생성시 오디오 출력 채널에 대한 맵핑 정보 (코드별로) 정보 있어야 함, 예를 들어서 LEFT 는 좌 채널, RIGHT는 우 채널에 맵핑, 맵핑 안된 코드는 아무런 처리 안함
6. 내보내기에 대해서 맵핑 정보가 필요함
현재 기준으로, Track을 렌더링하면 사용자가 정의한 코드 대로 트랙이 렌더링 됨 예를 들어, {LEFT, RIGHT, STUFF1, STUFF2} 등... 이 각각의 코드를 어떻게 출력 맵핑으로 걸 것인지 설정이 있어야 할 것으로 보임
댓글 0개
댓글은 일회용 패스워드가 발급되며 사이트 이용 약관에 동의로 간주됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.