PPT+VBA

오디오 재생바 책갈피트리거 애니메이션효과로 구현하기

쵸코난 2025. 3. 25. 05:12

 

 

 

 

오디오 재생바를 순수 애니메이션으로 구현하고자 합니다.

특히 재생바의 현재 위치 표시가 계속 오른쪽으로 이동하고

진행시간을 실시간으로 업데이트해야 합니다.

 

그런데 지난 번 처럼 VBA Timer를 이용해서 표시하지 않고

모두 애니메이션으로 구현합니다.

그래야 동영상으로 내보내기가 가능합니다.

 

일반 애니메이션은 1분이라는 시간제한이 있으므로 일반 순차적인 애니메이션보다는

오디오 책갈피(북마크) 트리거를 이용하는 것이 좋습니다.

(오디오 책갈피 애니메이션은 VBA매크로가 아니라 순수 애니메이션효과이기 때문에 동영상으로 내보내기해도 그대로 작동합니다.)

 

 

오디오를 삽입하고 자동재생하게 한 다음

1초마다 오디오에 책갈피를 삽입해서 해당 시간대에 도달하면

재생바나 타이머 애니메이션이 호출되게 하는 것입니다.

오디오 트리거는 최대 512개를 추가할 수 있으므로 8분 32초까지 트리거 애니메이션을 넣을 수 있습니다.

오디오가 더 길다면 오디오를 분할하여야 합니다.

VBA로 오디오 북마크를 자동으로 추가하는 것은 아래 글이 도움이 될 수 있습니다.

https://konahn.tistory.com/entry/TimeBar

 

이번 기회에 자동으로 진행 타이머애니메이션을 만들어주는 VBA를 만들어봤습니다.

먼저 오디오북마크를 오디오 길이만큼 추가하고

00:000, 00:01, 00:02... 로 변하는 시간타이머도 오디오 길이만큼 추가,

진행바에서 현재 위치를 나타내는 마커도형도 매 초마다 오른쪽으로 총 길이/총 재생시간 만큼 자동으로 이동하는 애니메이션을 생성해서

매 1초마다 시간 타이머가 나타나고(닦아내기) 또한 진행 마커도형도 이동하게 트리거 애니메이션을 추가하도록 자동 VBA를 만들어 보았습니다.

일단 슬라이드에 아래와 같은 개체를 배치합니다.

mp3 오디오 (자동재생 설정)

Line_ 이라는 재생바

Timer_ 라는 시간 타이머 텍스트박스

Time_end 라는 오디오재생길이 텍스트 박스

Pos_ 라는 재생바상의 현재 위치 도형

 

 

이제 Alt+F8로 A1_0Batch 매크로를 실행합니다.

 

 

그러면 A1_1, 2, 3 매크로가 차례로 실행됩니다.

더보기
Option Explicit


Sub A1_0Batch()

    A1_1AddAudioBookmark
    A1_2AddTimerCount
    A1_3ddBookmarkTrigger

End Sub

 

  • A1_1AddAudioBookmark

현재 선택된 오디오의 길이를 알아내서

1초마다 책갈피를 자동으로 추가합니다.

오디오북마크(책갈피)는 최대 512개 추가가 가능합니다. 약 8분 32초 길이입니다.

더보기

'오디오에 미디어 북마크를 자동으로 추가
Sub A1_1AddAudioBookmark()

    Dim sld As Slide
    Dim shp As Shape
    Dim mbk As MediaBookmark
    Dim aLength&, aStart&, aEnd&, aLen&
    Dim i As Long
     
    On Error Resume Next
    Set shp = ActiveWindow.Selection.ShapeRange(1)
    If shp Is Nothing Or shp.Type <> msoMedia Then MsgBox "오디오를 선택하세요.": Exit Sub
    On Error GoTo 0
    Set sld = shp.Parent
    
    '기존 북마크 제거
    For i = shp.MediaFormat.MediaBookmarks.Count To 1 Step -1
        shp.MediaFormat.MediaBookmarks.Item(i).Delete
    Next i
    
    '오디오 길이, 시작/끝 위치
    With shp.MediaFormat
        aLength = .Length       ' 오디오 총길이
        aStart = .StartPoint    '트리밍시 시작위치
        aEnd = .EndPoint        '트리밍시 끝 위치
        aLen = Math.Round((aEnd - aStart) / 1000)   '실제 재생 길이(초)
    End With
    
    '북마크 일괄 추가
    For i = 1 To aLen
        Set mbk = shp.MediaFormat.MediaBookmarks.Add(aStart + 1000 * (i - 1), "Bookmark" & i)
    Next i
    
    
End Sub

 

 

  • A1_2AddTimerCount

Timer_ 라는 텍스트박스 도형을 복제해서 재생길이만큼 00:00 , 00:01, 00:02 도형을 생성합니다.

Timer_end 에는 재생길이를 입력해줍니다.

 

더보기
Sub A1_2AddTimerCount()
    
    Dim sld As Slide, shp As Shape
    Dim sn As Integer
    Dim i As Long, Limit As Long
    Dim Target As String
    Dim oLeft As Single, oTop As Single
    Dim TimeStart As Integer, TimeEnd As Integer, TimeStep As Integer
    Dim aLength&, aStart&, aEnd&, aLen&
    
    On Error Resume Next
    Set shp = ActiveWindow.Selection.ShapeRange(1)
    If shp Is Nothing Or shp.Type <> msoMedia Then MsgBox "오디오를 선택하세요.": Exit Sub
    On Error GoTo 0
    Set sld = shp.Parent
    
    '오디오 길이, 시작/끝 위치
    With shp.MediaFormat
        aLength = .Length       ' 오디오 총길이
        aStart = .StartPoint    '트리밍시 시작위치
        aEnd = .EndPoint        '트리밍시 끝 위치
        aLen = Math.Round((aEnd - aStart) / 1000)   '실제 재생 길이(초)
    End With
    
    Limit = aLen
    If Limit > 0 Then TimeStart = -1: TimeEnd = Limit + 1: TimeStep = 1
    If Limit < 0 Then Limit = -Limit: TimeStart = Limit + 1: TimeEnd = -1: TimeStep = -1
    
    '기존 타이머 텍스트상자 삭제
    Target = "Timer_"
    For i = sld.Shapes.Count To 1 Step -1
        If sld.Shapes(i).Name Like Target & "*" And sld.Shapes(i).Name <> Target Then
            sld.Shapes(i).Delete
        End If
    Next i
  
    '타이머 텍스트상자 원래 위치 저장하고 복사하기
    With sld.Shapes(Target)
        oLeft = .Left: oTop = .Top
        .Copy
    End With
        
    '타이머 복제
    For i = TimeStart To TimeEnd Step TimeStep
        If i >= -Limit And i <= Limit And i <> TimeEnd And i <> TimeStart Then
              '현재 선택슬라이드에 붙이기
            With sld.Shapes.Paste(1)
                'Integer를 00:00 형태로 변환(1은 1일을 의미하므로 하루86400으로 나눔)
                .TextFrame.TextRange.Text = Format(Abs(i) / 86400, "nn:ss")
                .Name = Target & i
                .Left = oLeft: .Top = oTop  '위치 원래대로
            End With
        End If
    Next i
    
    '오디오 총 길이
    sld.Shapes("Time_end").TextFrame.TextRange.Text = Format((TimeEnd - 1) / 86400, "nn:ss")
 
End Sub

'기존 Timer 애니메이션 도형 모두 삭제
Sub RemoveTimer()
    Dim i As Integer
    
    With ActiveWindow.Selection.SlideRange(1)
        For i = .Shapes.Count To 1 Step -1
            If .Shapes(i).Name Like "Timer_*" Then .Shapes(i).Delete
        Next i
    End With
End Sub

 

  • A1_3AddBookmarkTrigger

각 책갈피마다 Timer_00, Timer_01 등의 도형이 나타나게(닦아내기)하고

또한 Pos_ 라는 재생바위치 마커도형이 (Line_ 도형의 넓이/ 총재생길이) 만큼 즉 한 눈금만큼 오른쪽으로 이동하도록 상대좌표 이동 애니메이션을 추가해줍니다.

 

더보기
'오디오북마크에 애니메이션 트리거 추가
Sub A1_3AddBookmarkTrigger()

    Dim sld As Slide
    Dim shp As Shape, shpM As Shape
    Dim eft As Effect, bhvr As AnimationBehavior
    Dim i As Long, j As Long, stp As Single
    Dim aLength&, aStart&, aEnd&, aLen&

    On Error Resume Next
    Set shpM = ActiveWindow.Selection.ShapeRange(1)
    If shpM Is Nothing Or shpM.Type <> msoMedia Then MsgBox "오디오를 선택하세요.": Exit Sub
    On Error GoTo 0
    Set sld = shpM.Parent
    
    '기존 일반 애니메이션 효과 모두 삭제
    'For i = sld.TimeLine.MainSequence.Count To 1 Step -1
    '    If sld.TimeLine.MainSequence.Item(i).Shape.Name Like "Tick_*" Then _
    '        sld.TimeLine.MainSequence.Item(i).Delete
    'Next i
    '기존 오디오 트리거 애니메이션 효과 모두 삭제
    For i = sld.TimeLine.InteractiveSequences.Count To 1 Step -1
        For j = sld.TimeLine.InteractiveSequences(i).Count To 1 Step -1
            If sld.TimeLine.InteractiveSequences(i).Item(j).Timing.TriggerShape.Name Like shpM.Name Then _
                sld.TimeLine.InteractiveSequences(i).Item(j).Delete
        Next j
    Next i
    
    '오디오 길이, 시작/끝 위치
    With shpM.MediaFormat
        aLength = .Length       ' 오디오 총길이
        aStart = .StartPoint    '트리밍시 시작위치
        aEnd = .EndPoint        '트리밍시 끝 위치
        aLen = Math.Round((aEnd - aStart) / 1000)   '실제 재생 길이(초)
    End With
   
    '진행바 이동거리 계산
    stp = sld.Shapes("Line_").Width / shpM.MediaFormat.MediaBookmarks.Count         '7.58..
    stp = stp / sld.Parent.PageSetup.SlideWidth                                     '0.007<  7.58E-03  < 0.01
    Debug.Print stp
    '새로 추가
    For i = 1 To shpM.MediaFormat.MediaBookmarks.Count
            
        '진행시간 나타나기 애니메이션
        Set shp = sld.Shapes("Timer_" & i)
        Set eft = sld.TimeLine.InteractiveSequences.Add.AddTriggerEffect(pShape:=shp, effectId:=msoAnimEffectWipe, _
            Trigger:=msoAnimTriggerOnMediaBookmark, pTriggerShape:=shpM, bookmark:="Bookmark" & i)
        eft.Timing.Duration = 1
        eft.Timing.TriggerType = msoAnimTriggerWithPrevious
        eft.EffectParameters.Direction = msoAnimDirectionDown
             'Trigger:=msoAnimTriggerOnPageClick)
             
        '막대바 이동 애니메이션
        Set shp = sld.Shapes("Pos_")
        Set eft = sld.TimeLine.InteractiveSequences.Add.AddTriggerEffect(pShape:=shp, effectId:=msoAnimEffectPathRight, _
            Trigger:=msoAnimTriggerOnMediaBookmark, pTriggerShape:=shpM, bookmark:="Bookmark" & i)
        eft.Timing.Duration = 1
        eft.Timing.TriggerType = msoAnimTriggerWithPrevious
        eft.Timing.SmoothStart = 0:    eft.Timing.SmoothEnd = 0
        Set bhvr = eft.Behaviors.Add(msoAnimTypeMotion)
        With bhvr.MotionEffect
            '현재 단계만큼 위로 이동한 지점에서 상대적으로 위로 stp(0.05등) 만큼 이동(직선)
            .Path = "M " & stp * (i - 1) & " 0 l " & stp & " 0"
        End With
        eft.Behaviors(eft.Behaviors.Count - 1).Delete
        
    Next i

End Sub

좌표이동 VML 명령어는 대략적으로 풀이하면 아래와 같습니다.

M(이동) 기준x좌표 기준y좌표 l(상대이동) 이동거리(좌표)x 이동거리(좌표)y E(끝)

 

소문자 l로 상대적으로 이동하도록 하고 있는데 대문자L은 출발점기준 절대좌표로 이동합니다.

예를 들어 l 0.5 0 은 이전 위치로부터 화면의 절반만큼을 x좌표 이동하는 명령입니다.

M 0.1 0 l 0.2 0 E 는 화면 상단에 걸친 1/10 (0.1) 지점의 도형을 화면의 2/10 (0.2)만큼 x좌표만 오른쪽으로 이동시킵니다. 

 

좌표이동 애니메이션은 조금 어려운 부분일 수 있는데 아래 지난 글을 참고 바랍니다.

 

좌표이동 애니메이션 관련 참고1: https://konahn.tistory.com/entry/VMLedit

좌표이동 애니메이션 관련 참고2: https://konahn.tistory.com/entry/AddVML

 

오디오 재생이므로 재생바 하단 등에 재생, 일시정지, 정지 도형을 삽입하고

해당 오디오 재생, 일시정지, 정지 애니메이션을 트리거로 지정해서 중간에 일시정지하거나 재생/정지버튼을 추가해 주는 것도 좋습니다.

주의) 

- 현재 완전 정지했다가 다시 재생하면 기존 Timer_xx 도형이 나타나있어서 정지된 시간까지 이전 Timer 도형이 나타나지 않습니다.

- 0초에 모든 Timer 도형이 사라지게 애니메이션을 추가해주면 되지만 애니메이션이 너무 많아져서 생략했습니다.

- 또한 재생 타이머 시간을 나타나게 하는 것도 이전 타이머가 사라지고 현재 타이머가 나타나게 하는 것이 더 확실하지만 여기서는 단순하게 새로운 시간 타이머가 기존 타이머를 가리고 나타나도록 했습니다.

오디오 북마크와 애니메이션이 추가된 슬라이드의 모습 :

 

캡쳐영상: 2슬라이드와 4슬라이드에 2가지 음악으로 테스트해보았습니다.

사용된 음악은 bensound.com과 No Copyright음악을 사용했습니다. 자세한 출처는 슬라이드를 참고하세요.

 

 

첨부파일은 다운 받아서 파일속성에서 차단해제에 체크/확인하고 매크로 허용해서 여세요.

 

AudioProgress2Animation.pptm
7.37MB

 

 

관련: 지식인