Adobe Connect 비디오를 mp4로 다운로드하거나 청취 속도를 높이려면 어떻게 해야 합니까?
아이디어:
CPU나 이 Chrome Flash Player 애플리케이션의 시간을 더 빠르게 흐르게 하여 비디오 재생을 더 빠르게 만들기 위해 어떤 방식으로든 내 컴퓨터를 해킹합니다. 적어도 영상에서는 이것이 가능하다고 생각하고, 사운드에서는 피치가 바뀌지 않기를 바랍니다. 내 OS는 Debian 기반 Linux 버전입니다.
모든 것을 화면 녹화하지만 전용 컴퓨터를 실행해야 하고 동시에 다른 일을 할 수 없기 때문에 여전히 지루할 것입니다.
/output/filename.zip?download=zip
이를 URL에 추가하는 기존 해킹을 사용하여 비디오를 다운로드하십시오 . 그러나 이로 인해 17개(또는 그 이상)의 가혹한 파일.flv
과.xml
분리된 오디오 및 비디오가 포함된 파일로 가득 찬 zip 파일이 생성됩니다. 이를 일반 비디오로 다시 변환하는 도구를 검색했지만 유용한 것을 찾지 못했습니다. 나는 그 짜증나고 거친 파일들이 재생을 위해 이미 브라우저의 캐시에 다운로드된 파일들과 동일하다는 것을 발견했습니다.거친 zip 파일 대신
/output/filename.mp4?download=mp4
사용할 수 있는 가능성을 활성화하는 등 mp4 다운로드를 잠금 해제하도록 모든 교수에게 요청하세요 .download=mp4
하지만 이렇게 하면 관리 설정에 있는 모든 사람이 자신의 비디오에 공개적으로 액세스할 수 있도록 허용해야 하므로 이것이 선택 사항인지 확실하지 않습니다.
답변1
Adobe Connect ID가 p6vwxp2d0c2f, 즉 URL이 다음과 같다고 가정합니다.https://my.adobeconnect.com/p6vwxp2d0c2f. 질문에서 언급했듯이 /output/p6vwxp2d0c2f.zip?download=zip
URL 끝에 추가하여 여러 오디오 및 비디오 파일과 일부 .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