Adobe Connect 비디오를 mp4로 다운로드하거나 청취 속도를 높이려면 어떻게 해야 합니까?

Adobe Connect 비디오를 mp4로 다운로드하거나 청취 속도를 높이려면 어떻게 해야 합니까?

Adobe Connect 비디오를 mp4로 다운로드하거나 청취 속도를 높이려면 어떻게 해야 합니까?

아이디어:

  1. CPU나 이 Chrome Flash Player 애플리케이션의 시간을 더 빠르게 흐르게 하여 비디오 재생을 더 빠르게 만들기 위해 어떤 방식으로든 내 컴퓨터를 해킹합니다. 적어도 영상에서는 이것이 가능하다고 생각하고, 사운드에서는 피치가 바뀌지 않기를 바랍니다. 내 OS는 Debian 기반 Linux 버전입니다.

  2. 모든 것을 화면 녹화하지만 전용 컴퓨터를 실행해야 하고 동시에 다른 일을 할 수 없기 때문에 여전히 지루할 것입니다.

  3. /output/filename.zip?download=zip이를 URL에 추가하는 기존 해킹을 사용하여 비디오를 다운로드하십시오 . 그러나 이로 인해 17개(또는 그 이상)의 가혹한 파일 .flv.xml분리된 오디오 및 비디오가 포함된 파일로 가득 찬 zip 파일이 생성됩니다. 이를 일반 비디오로 다시 변환하는 도구를 검색했지만 유용한 것을 찾지 못했습니다. 나는 그 짜증나고 거친 파일들이 재생을 위해 이미 브라우저의 캐시에 다운로드된 파일들과 동일하다는 것을 발견했습니다.

  4. 거친 zip 파일 대신 /output/filename.mp4?download=mp4사용할 수 있는 가능성을 활성화하는 등 mp4 다운로드를 잠금 해제하도록 모든 교수에게 요청하세요 . download=mp4하지만 이렇게 하면 관리 설정에 있는 모든 사람이 자신의 비디오에 공개적으로 액세스할 수 있도록 허용해야 하므로 이것이 선택 사항인지 확실하지 않습니다.

답변1

Adobe Connect ID가 p6vwxp2d0c2f, 즉 URL이 다음과 같다고 가정합니다.https://my.adobeconnect.com/p6vwxp2d0c2f. 질문에서 언급했듯이 /output/p6vwxp2d0c2f.zip?download=zipURL 끝에 추가하여 여러 오디오 및 비디오 파일과 일부 .xml 파일이 포함된 일부 zip 아카이브를 다운로드할 수 있습니다. 예:https://my.adobeconnect.com/p6vwxp2d0c2e/output/p6vwxp2d0c2e.zip?download=zip다음을 포함할 수 있습니다:

 Directory of C:\Users\[...]\p6vwxp2d0c2f

02/09/2019  11:27 AM    <DIR>          .
02/09/2019  11:27 AM    <DIR>          ..
02/09/2019  11:00 AM        52,239,473 cameraVoip_1_11.flv
02/09/2019  11:00 AM         1,364,573 cameraVoip_1_11.xml
02/09/2019  11:00 AM         7,176,904 cameraVoip_1_15.flv
02/09/2019  11:00 AM           188,012 cameraVoip_1_15.xml
02/09/2019  11:00 AM             6,004 cameraVoip_1_3.flv
02/09/2019  11:00 AM             1,698 cameraVoip_1_3.xml
02/09/2019  11:00 AM        62,603,505 cameraVoip_1_7.flv
02/09/2019  11:00 AM         1,625,383 cameraVoip_1_7.xml
02/09/2019  11:00 AM             2,249 ftcontent1.flv
02/09/2019  11:00 AM             8,219 ftcontent1.xml
02/09/2019  11:00 AM            25,685 ftcontent13.flv
02/09/2019  11:00 AM            85,464 ftcontent13.xml
02/09/2019  11:00 AM           199,781 ftcontent5.flv
02/09/2019  11:00 AM           657,091 ftcontent5.xml
02/09/2019  11:00 AM           182,297 ftcontent9.flv
02/09/2019  11:00 AM           601,758 ftcontent9.xml
02/09/2019  11:00 AM             1,354 fttitle0.flv
02/09/2019  11:00 AM             3,272 fttitle0.xml
02/09/2019  11:00 AM             1,354 fttitle12.flv
02/09/2019  11:00 AM             3,298 fttitle12.xml
02/09/2019  11:00 AM             1,354 fttitle4.flv
02/09/2019  11:00 AM             3,290 fttitle4.xml
02/09/2019  11:00 AM             1,354 fttitle8.flv
02/09/2019  11:00 AM             3,298 fttitle8.xml
02/09/2019  11:00 AM         1,815,158 indexstream.flv
02/09/2019  11:00 AM         7,703,603 indexstream.xml
02/09/2019  11:00 AM         5,316,597 mainstream.flv
02/09/2019  11:00 AM        21,259,001 mainstream.xml
02/09/2019  11:00 AM       217,448,561 screenshare_2_10.flv
02/09/2019  11:01 AM         1,364,572 screenshare_2_10.xml
02/09/2019  11:01 AM        32,364,457 screenshare_2_14.flv
02/09/2019  11:01 AM           188,011 screenshare_2_14.xml
02/09/2019  11:01 AM           387,981 screenshare_2_2.flv
02/09/2019  11:01 AM             1,698 screenshare_2_2.xml
02/09/2019  11:01 AM       237,470,572 screenshare_2_6.flv
02/09/2019  11:01 AM         1,625,385 screenshare_2_6.xml
02/09/2019  11:01 AM                48 telephony-files.xml
02/09/2019  11:01 AM               691 transcriptstream.flv
02/09/2019  11:01 AM             2,391 transcriptstream.xml
              39 File(s)    653,935,396 bytes
               2 Dir(s)   1,590,358,016 bytes free
  • 카메라Voip__.xml에는 오디오 + 웹캠이 포함되어 있습니다.
  • 화면 공유__.xml에는 오디오 + 웹캠이 포함되어 있습니다.

이들을 병합하려면 다음을 사용할 수 있습니다 (저는 Oliver Wang / Yannick Hold-Geoffroy / Aaron Hertzmann의 명령을 ffmpeg받았습니다 ).ffmpeg

ffmpeg -i cameraVoip_1_11.flv -i screenshare_2_10.flv -c copy -map 0:a:0 -map 1:v:0 -shortest output.flv

어디:

  • -map 0:a:0: 오디오에만 사용할 첫 번째 입력 파일을 매핑합니다.
  • -map 1:v:0: 비디오에만 사용할 두 번째 입력 파일을 매핑합니다.
  • -shortest: CameraVoip_1_11.flv와 screenshare_2_10.flv의 길이가 같지 않을 경우 오디오나 비디오를 잘라냅니다.

웹캠 비디오를 유지하고 비디오 화면 공유의 일부 구석에 배치하려면 다음을 수행하십시오.

ffmpeg -i cameraVoip_1_11.flv -i screenshare_2_10.flv  \
                         -filter_complex \
                         "color=s=1072x480:c=black [base]; [0:v] setpts=PTS-STARTPTS, scale=640x480 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=432x240 [upperright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=640" \
                         -c:v libx264 -c:a mp2 output.mkv

카메라 매핑에 관하여Voip__.xml을 올바른 화면 공유로__.xml(둘 이상인 경우):

카메라를 볼 수도 있어요Voip__.xml / 화면 공유__.xml 오디오/화면 공유 비디오가 시작된 타임스탬프를 가져옵니다. 이를 통해 화면 공유를 매핑할 수 있습니다__올바른 카메라가 포함된 .xmlVoip__.xml.

예를 들어,https://my.adobeconnect.com/p6vwxp2d0c2f/output/p6vwxp2d0c2f.zip?download=zip, CameraVoip_1_11.xml의 21번째 줄:

<String><![CDATA[Thu Feb 07 21:11:23 2019]]></String>

그렇지 않은 경우 다른 방법은 CameraVoip_를 정렬하는 것입니다._.xml / 화면 공유__.xml을 만든 다음 첫 번째 카메라Voip_를 매핑합니다._.xml 첫 번째 화면 공유__.xml, 두 번째 카메라Voip__.xml 첫 번째 화면 공유__.xml 등. 어떤 경우에는 깨지는지 모르겠습니다(제가 살펴본 몇 가지 Adobe Connect 녹음에서는 괜찮은 것 같지만 아마도 사람들이 항상 화면을 공유하기 때문일 것입니다).


프로세스를 자동화하기 위해 Python 스크립트를 작성했습니다(코드 저장소:https://github.com/Franck-Dernoncourt/adobe-connect-video-downloader):

'''
Requirements:
- python 2.7 or 3
- wget, unzip, and ffmpeg accessible from command line.

Examples:
python connect2vid_v2.py https://my.adobeconnect.com/pqc06mcawjgn/  --output_filename=" Understanding how the Network impacts your service"

Please email Franck Dernoncourt <[email protected]> if you improve this code.
'''

import shlex
import subprocess
import os
import glob
import argparse
import sys
import re


def run_command(command):
    print('running command: {0}'.format(command))
    process = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE)
    while True:
        output = process.stdout.readline()
        print(output.strip())
        if output == b'' and process.poll() is not None:
            print('Done running the command.')
            break
        if output:
            print(output.strip())
    rc = process.poll()
    return rc

def create_folder_if_not_exists(directory):
    '''
    Create the folder if it doesn't exist already.
    '''
    if not os.path.exists(directory):
        os.makedirs(directory)

def extract_connect_id(parser, args):
    '''
    Function written by Aaron Hertzmann
    '''
    # ----- extract the connectID or ZIP file  -----

    if len(args.URLorIDorZIP) < 1:
    #    print('Error: No Connect recording URL provided.')
        parser.print_help()
        sys.exit(0)

    if args.URLorIDorZIP[0][-4:].lower() == '.zip':
        sourceZIP = args.URLorIDorZIP[0]
        connectID = os.path.basename(sourceZIP[:-4])
    elif len(args.URLorIDorZIP[0]) == 12:
        connectID = args.URLorIDorZIP[0]
    else:
        s = args.URLorIDorZIP[0].split('/')
        connectID = None
        for i in range(len(s)-1):
            if 'adobeconnect.com' in s[i]:
                connectID = s[i+1]
                break
        if connectID == None:
            print("Error: couldn't parse URL")
            sys.exit(1)

    return connectID


def main():
    '''
    This is the main function
    '''

    # ================ parse the arguments (part of the parsing code was written by Aaron Hertzmann) ======================

    parser = argparse.ArgumentParser(description='Download an Adobe Connect recording and convert to a video file.')
    parser.add_argument('URLorIDorZIP', nargs='*', help='URL, code, or ZIP file for the Connect recording')
    parser.add_argument('--output_folder',default='output_videos',help='Folder for output files')
    parser.add_argument('--output_filename',default='noname', help='output_filename')
    args = parser.parse_args()

    #main_output_folder = "all_videos"
    main_output_folder = args.output_folder
    output_filename = args.output_filename
    output_filename =  re.sub(r'[^\w\s]','', output_filename)
    output_filename = output_filename.replace('@', '').strip()
    print('output_filename: {0}'.format(output_filename))
    connect_id = 'pul1pgdvpr87'
    connect_id = 'p6vwxp2d0c2f'
    connect_id = extract_connect_id(parser, args)
    video_filename = 'hello'
    video_filename = output_filename

    # ================ Download video  ======================
    output_folder = connect_id
    output_zip_filename = '{0}.zip'.format(connect_id)
    create_folder_if_not_exists(output_folder)
    create_folder_if_not_exists(main_output_folder)

    # Step 1: retrieve audio and video files
    connect_zip_url = 'https://my.adobeconnect.com/{0}/output/{0}.zip?download=zip'.format(connect_id)
    wget_command = 'wget -nc -O {1} {0}'.format(connect_zip_url, output_zip_filename) # -nc, --no-clobber: skip downloads that would download to existing files.
    run_command(wget_command)
    unzip_command = 'unzip -n {0} -d {1}'.format(output_zip_filename, output_folder) # -n: Unzip only newer files.
    run_command(unzip_command)

    # Step 2: create final video output
    cameraVoip_filepaths = []
    for filepaths in sorted(glob.glob(os.path.join(output_folder, 'cameraVoip_*.flv'))):
        cameraVoip_filepaths.append(filepaths)
    print('cameraVoip_filepaths: {0}'.format(cameraVoip_filepaths))

    screenshare_filepaths = []
    for filepaths in sorted(glob.glob(os.path.join(output_folder, 'screenshare_*.flv'))):
        screenshare_filepaths.append(filepaths)

    part = 0
    output_filepaths = []
    for cameraVoip_filepath, screenshare_filepath in zip(cameraVoip_filepaths, screenshare_filepaths):
        output_filepath = os.path.join(main_output_folder, '{0}_{1:04d}.flv'.format(video_filename, part))
        #output_filepath = '{0}_{1:04d}.flv'.format(video_filename, part)
        output_filepaths.append(output_filepath)
        # ffmpeg command from Oliver Wang / Yannick Hold-Geoffroy / Aaron Hertzmann
        conversion_command = 'ffmpeg -i "%s" -i "%s" -c copy -map 0:a:0 -map 1:v:0 -shortest -y "%s"'%(cameraVoip_filepath, screenshare_filepath, output_filepath)
        # -y: override output file if exists
        run_command(conversion_command)
        part += 1

    # Concatenate all videos into one single video
    # https://stackoverflow.com/questions/7333232/how-to-concatenate-two-mp4-files-using-ffmpeg
    video_list_filename = 'video_list.txt'
    video_list_file = open(video_list_filename, 'w')
    for output_filepath in output_filepaths:
        video_list_file.write("file '{0}'\n".format(output_filepath))
    video_list_file.close()
    final_output_filepath = '{0}.flv'.format(video_filename)
    # ffmpeg command from Oliver Wang / Yannick Hold-Geoffroy / Aaron Hertzmann
    conversion_command = 'ffmpeg -safe 0 -y -f concat -i "{1}" -c copy "{0}"'.format(final_output_filepath, video_list_filename)
    run_command(conversion_command)
    #os.remove(video_list_filename)

if __name__ == "__main__":
    main()
    #cProfile.run('main()') # if you want to do some profiling

관련 정보