Camtasia - "변경된" 볼륨을 일괄 설정하는 방법
Camtasia를 사용해 오디오를 편집하는 경우,
위의 그림을 보면 3가지 구역으로 나뉘는데요,
- 가장 좌측 구역: 볼륨 게이지를 변경한 경우,
- 중간 구역: Audio Point를 추가하고 볼륨 게이지를 변경한 경우,
- 우측 구역: 기본 볼륨 상태인 경우,
위에서 첫 번째와 두 번째 경우는 "변경"의 값을 보관하기 위해 "volume"이라는 값이 추가됩니다.
"parameters": {
"volume": {
"type": "double",
"keyframes": [
{
"endTime": 0,
"time": 0,
"value": 0.3,
"duration": 0
},
{
"endTime": 6232800000,
"time": 6232800000,
"value": 0.3,
"duration": 0
},
]
}
},
위에서는 그 값이 "0.3"인데, 따라서 "30%"의 출력으로 바뀐 것으로 그림에서는 "중간 구역"의 설정에 해당합니다.
재미있는 건, 3번째 경우입니다. 이런 경우는 명시적인 "volume" 값이 아니라 단순히 "gain"이라는 값이 1.0으로만 설정돼 있습니다.
"id": 30,
"_type": "AMFile",
"src": 1,
"trackNumber": 2,
"attributes": {
"ident": "01",
"gain": 1.0,
"mixToMono": false,
"loudnessNormalization": true,
"sourceFileOffset": 0
},
이 값은 오디오의 속성 창에서 변경 가능한 "Gain" 값을 반영합니다. 따라서 만약에 위의 구역을 선택하고 Gain을 다음과 같이 "200%"로 바꾸면,
해당 값은 "gain"이 2.0으로 반영됩니다. 즉 "volume" 값이 생성되지는 않고 "gain"만 변경되는 것입니다.
이로 인해, 오디오를 일괄적으로 변경하려면 2가지 방법으로 나뉩니다.
- 사용자가 단순히 gain 값만을 변경하거나, 기본 값인 경우
- 사용자가 오디오 레벨을 명시적으로 설정한 경우
우선, 위의 첫 번째 방식으로 변경했다면 단순히 해당 구역을 다중 선택(구역을 드래그 하거나, Ctrl+Shift 키와 함께 클릭)으로 지정하고 오디오 속성에서 "Gain"을 변경하면 됩니다.
재미있는 건, "Gain"으로 변경한 것은 "volume"에는 반영되지 않는다는 점입니다. 즉 위의 두 번째 방식으로 설정된 구역의 "volume"은 "Gain"과는 무관합니다.
문제는, "volume"을 일괄 변경하는 방법이 (제가 모를 수도 있지만) Camtasia에 아직 제공되지 않습니다. 어쩔 수 없이 일일이 구역 하나하나를 선택하고 모두 바꿔야 하는데요, 다행히 Camtasia가 유지하는 프로젝트 파일인 tscproj가 json 형식을 따르기 때문에 다음과 같이 간단한 파이썬 코딩으로 일괄 변경할 수 있습니다.
import json
f = open("test.tscproj")
new_file = open("new.json", "w")
data = json.load(f)
timeline = data['timeline']
sceneTrack = timeline['sceneTrack']
new_volume = 1.0
for scene in sceneTrack['scenes']:
csml = scene['csml']
for track in csml['tracks']:
trackIndex = track['trackIndex']
for media in track['medias']:
if 'parameters' in media:
parameters = media['parameters']
if 'volume' in parameters:
volume = parameters['volume']
if isinstance(volume, float):
parameters['volume'] = new_volume
else:
volume_type = volume['type']
if volume_type == 'double':
for key_frame in volume['keyframes']:
keyframe_value = key_frame['value']
if isinstance(keyframe_value, float):
key_frame['value'] = new_volume
json.dump(data, new_file, indent=4)
f.close()
new_file.close()
위의 스크립트는 test.tscproj 파일을 읽어 "new.json" 파일로 저장하는데, 이때 test.tscproj에 포함된 모든 "volume"의 값을 1.0(100%)로 바꾸게 됩니다.
간단하죠? ^^