如何将Adobe Connect录制内容导出为视频?

时间:2011-03-03 10:32:15

标签: adobe video-streaming video-capture conference

我有录制会议的链接,如何从中导出视频?

3 个答案:

答案 0 :(得分:22)

  1. 登录您的Adobe Connect帐户
  2. 点击会议> 我的会议
  3. 点击录制链接
  4. 点击“录制”链接(屏幕右侧)
  5. 点击“名称”栏中的链接
  6. 复制“用于查看的网址” - 示例,http://mycompany.adobeconnect.com/p12345678/
  7. 将其粘贴到新的浏览器标签中,然后将以下内容添加到网址末尾:output/filename.zip?download=zip
  8. 您的网址应与此示例http://mycompany.adobeconnect.com/p12345678/output/filename.zip?download=zip
  9. 类似

答案 1 :(得分:1)

我编写了以下Python脚本以将Adobe Connect记录导出为视频:

'''
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 <franck.dernoncourt@gmail.com> 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

说明脚本的工作方式:

假定Adobe Connect ID为p6vwxp2d0c2f,即URL为https://my.adobeconnect.com/p6vwxp2d0c2f。您可以在URL的末尾添加/output/p6vwxp2d0c2f.zip?download=zip,以下载一些zip存档,其中包含大量音频和视频文件以及一些.xml文件。例如,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
  • cameraVoip_ _ .xml包含音频+网络摄像头(如果有)。
  • screenshare_ _ .xml包含音频+网络摄像头(如果有)。

要合并它们,可以使用ffmpeg(我从Oliver Wang / Yannick Hold-Geoffroy / Aaron Hertzmann那里获得了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

关于将cameraVoip_ _ .xml映射到正确的screenshare_ _ .xml,如果存在多个:

可以查看cameraVoip_ _ .xml / screenshare_ _ .xml,以获取音频/屏幕共享视频开始的时间戳。这样可以使用正确的cameraVoip_ _ .xml映射screenshare_ _ .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 / screenshare_ _ .xml进行排序,然后映射第一个cameraVoip_ _ .xml第一个screenshare_ _ .xml,第二个cameraVoip_ _ .xml,第一个screenshare_ _ .xml,依此类推。我不知道如果在某些情况下会中断(对于我看过的几对Adobe Connect录音似乎没问题,但这也许是因为人们总是共享屏幕)。

答案 2 :(得分:0)

在Connect Central中,在录制列表中,有一个“脱机”链接。这将在本地计算机上创建录制的FLV。不幸的是,创建此视频只需录制视频即可。遵循应用程序提供的指导以获得最佳质量。

然后,您可以将FLV转码为您喜欢的格式。

您必须是已录制会议的主持人,或已将录制内容移至内容库中。