How can I download Adobe Connect videos to mp4 or speed up listening?
How can I download Adobe Connect videos to mp4 or speed up listening?
Ideas:
Hack my computer in some way so as to make the video playback faster by making time pass faster in the CPU or something for this Chrome Flash Player application. I think this is possible for the video at least, and for the sound, I hope this will not change its pitch. My OS is a Debian-based version of Linux.
Screen record the whole thing, but this would still be tedious since it would require me to have a dedicated computer running for that, I couldn't do something else at the same time.
Download the videos by using the existing
/output/filename.zip?download=zip
hack that is to append this to the URL. But this results in a zip file full of 17 (or more) harsh.flv
and.xml
files containing separated audio and video. I searched for a tool to convert those back to the regular video, and I haven't found anything useful. I found that those annoying and harsh files are the same than the ones that are already downloaded in the browser's cache for the playback.Ask every professor to unlock the mp4 download such as enabling the possibility of using
/output/filename.mp4?download=mp4
withdownload=mp4
rather than a harsh zip file. But I fear that this would require them to allow their video to be publicly accessible by anyone in their admin settings, so I'm not sure this is an option for them.
video download adobe-connect
migrated from security.stackexchange.com Sep 29 '17 at 15:24
This question came from our site for information security professionals.
|
show 1 more comment
How can I download Adobe Connect videos to mp4 or speed up listening?
Ideas:
Hack my computer in some way so as to make the video playback faster by making time pass faster in the CPU or something for this Chrome Flash Player application. I think this is possible for the video at least, and for the sound, I hope this will not change its pitch. My OS is a Debian-based version of Linux.
Screen record the whole thing, but this would still be tedious since it would require me to have a dedicated computer running for that, I couldn't do something else at the same time.
Download the videos by using the existing
/output/filename.zip?download=zip
hack that is to append this to the URL. But this results in a zip file full of 17 (or more) harsh.flv
and.xml
files containing separated audio and video. I searched for a tool to convert those back to the regular video, and I haven't found anything useful. I found that those annoying and harsh files are the same than the ones that are already downloaded in the browser's cache for the playback.Ask every professor to unlock the mp4 download such as enabling the possibility of using
/output/filename.mp4?download=mp4
withdownload=mp4
rather than a harsh zip file. But I fear that this would require them to allow their video to be publicly accessible by anyone in their admin settings, so I'm not sure this is an option for them.
video download adobe-connect
migrated from security.stackexchange.com Sep 29 '17 at 15:24
This question came from our site for information security professionals.
1
This is more of a question for Superuser, so I'm voting to close and move to SU.
– Mark Buffalo
Sep 28 '17 at 22:58
Can it be moved in some way? I don't want to do cross-posting.
– Guillaume Chevalier
Sep 28 '17 at 23:47
I mean, how can it be moved?
– Guillaume Chevalier
Sep 28 '17 at 23:48
One more close vote, and it should happen.
– Mark Buffalo
Sep 29 '17 at 0:41
I'd imagine that viewing the of the videos is recorded in the back-end of the Connect system and tracked to confirm viewing. Downloading the videos would likely prevent this confirmation. You would need to contact the institution's IT people regarding getting the videos, and the instructors and course monitors regarding confirming that you've watched it.
– music2myear
Jan 10 '18 at 19:29
|
show 1 more comment
How can I download Adobe Connect videos to mp4 or speed up listening?
Ideas:
Hack my computer in some way so as to make the video playback faster by making time pass faster in the CPU or something for this Chrome Flash Player application. I think this is possible for the video at least, and for the sound, I hope this will not change its pitch. My OS is a Debian-based version of Linux.
Screen record the whole thing, but this would still be tedious since it would require me to have a dedicated computer running for that, I couldn't do something else at the same time.
Download the videos by using the existing
/output/filename.zip?download=zip
hack that is to append this to the URL. But this results in a zip file full of 17 (or more) harsh.flv
and.xml
files containing separated audio and video. I searched for a tool to convert those back to the regular video, and I haven't found anything useful. I found that those annoying and harsh files are the same than the ones that are already downloaded in the browser's cache for the playback.Ask every professor to unlock the mp4 download such as enabling the possibility of using
/output/filename.mp4?download=mp4
withdownload=mp4
rather than a harsh zip file. But I fear that this would require them to allow their video to be publicly accessible by anyone in their admin settings, so I'm not sure this is an option for them.
video download adobe-connect
How can I download Adobe Connect videos to mp4 or speed up listening?
Ideas:
Hack my computer in some way so as to make the video playback faster by making time pass faster in the CPU or something for this Chrome Flash Player application. I think this is possible for the video at least, and for the sound, I hope this will not change its pitch. My OS is a Debian-based version of Linux.
Screen record the whole thing, but this would still be tedious since it would require me to have a dedicated computer running for that, I couldn't do something else at the same time.
Download the videos by using the existing
/output/filename.zip?download=zip
hack that is to append this to the URL. But this results in a zip file full of 17 (or more) harsh.flv
and.xml
files containing separated audio and video. I searched for a tool to convert those back to the regular video, and I haven't found anything useful. I found that those annoying and harsh files are the same than the ones that are already downloaded in the browser's cache for the playback.Ask every professor to unlock the mp4 download such as enabling the possibility of using
/output/filename.mp4?download=mp4
withdownload=mp4
rather than a harsh zip file. But I fear that this would require them to allow their video to be publicly accessible by anyone in their admin settings, so I'm not sure this is an option for them.
video download adobe-connect
video download adobe-connect
edited Feb 10 at 2:24
Franck Dernoncourt
8,3162189169
8,3162189169
asked Sep 28 '17 at 22:10
Guillaume ChevalierGuillaume Chevalier
1135
1135
migrated from security.stackexchange.com Sep 29 '17 at 15:24
This question came from our site for information security professionals.
migrated from security.stackexchange.com Sep 29 '17 at 15:24
This question came from our site for information security professionals.
1
This is more of a question for Superuser, so I'm voting to close and move to SU.
– Mark Buffalo
Sep 28 '17 at 22:58
Can it be moved in some way? I don't want to do cross-posting.
– Guillaume Chevalier
Sep 28 '17 at 23:47
I mean, how can it be moved?
– Guillaume Chevalier
Sep 28 '17 at 23:48
One more close vote, and it should happen.
– Mark Buffalo
Sep 29 '17 at 0:41
I'd imagine that viewing the of the videos is recorded in the back-end of the Connect system and tracked to confirm viewing. Downloading the videos would likely prevent this confirmation. You would need to contact the institution's IT people regarding getting the videos, and the instructors and course monitors regarding confirming that you've watched it.
– music2myear
Jan 10 '18 at 19:29
|
show 1 more comment
1
This is more of a question for Superuser, so I'm voting to close and move to SU.
– Mark Buffalo
Sep 28 '17 at 22:58
Can it be moved in some way? I don't want to do cross-posting.
– Guillaume Chevalier
Sep 28 '17 at 23:47
I mean, how can it be moved?
– Guillaume Chevalier
Sep 28 '17 at 23:48
One more close vote, and it should happen.
– Mark Buffalo
Sep 29 '17 at 0:41
I'd imagine that viewing the of the videos is recorded in the back-end of the Connect system and tracked to confirm viewing. Downloading the videos would likely prevent this confirmation. You would need to contact the institution's IT people regarding getting the videos, and the instructors and course monitors regarding confirming that you've watched it.
– music2myear
Jan 10 '18 at 19:29
1
1
This is more of a question for Superuser, so I'm voting to close and move to SU.
– Mark Buffalo
Sep 28 '17 at 22:58
This is more of a question for Superuser, so I'm voting to close and move to SU.
– Mark Buffalo
Sep 28 '17 at 22:58
Can it be moved in some way? I don't want to do cross-posting.
– Guillaume Chevalier
Sep 28 '17 at 23:47
Can it be moved in some way? I don't want to do cross-posting.
– Guillaume Chevalier
Sep 28 '17 at 23:47
I mean, how can it be moved?
– Guillaume Chevalier
Sep 28 '17 at 23:48
I mean, how can it be moved?
– Guillaume Chevalier
Sep 28 '17 at 23:48
One more close vote, and it should happen.
– Mark Buffalo
Sep 29 '17 at 0:41
One more close vote, and it should happen.
– Mark Buffalo
Sep 29 '17 at 0:41
I'd imagine that viewing the of the videos is recorded in the back-end of the Connect system and tracked to confirm viewing. Downloading the videos would likely prevent this confirmation. You would need to contact the institution's IT people regarding getting the videos, and the instructors and course monitors regarding confirming that you've watched it.
– music2myear
Jan 10 '18 at 19:29
I'd imagine that viewing the of the videos is recorded in the back-end of the Connect system and tracked to confirm viewing. Downloading the videos would likely prevent this confirmation. You would need to contact the institution's IT people regarding getting the videos, and the instructors and course monitors regarding confirming that you've watched it.
– music2myear
Jan 10 '18 at 19:29
|
show 1 more comment
1 Answer
1
active
oldest
votes
Assume that the Adobe Connect ID is p6vwxp2d0c2f, i.e. the URL is https://my.adobeconnect.com/p6vwxp2d0c2f. As you mentioned in the question, you can add /output/p6vwxp2d0c2f.zip?download=zip
at the end of the URL to download some zip archive containing a bunch of audio and video files as well as some .xml files. E.g., https://my.adobeconnect.com/p6vwxp2d0c2e/output/p6vwxp2d0c2e.zip?download=zip could contain:
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 contains the audio + webcam if any.
- screenshare__.xml contains the audio + webcam if any.
To merge them, you can use ffmpeg
(I took the ffmpeg
commands from Oliver Wang / Yannick Hold-Geoffroy / Aaron Hertzmann):
ffmpeg -i cameraVoip_1_11.flv -i screenshare_2_10.flv -c copy -map 0:a:0 -map 1:v:0 -shortest output.flv
where:
-map 0:a:0
: map the first input file to be used just for the audio.
-map 1:v:0
: map the second input file to be used just for the video.
-shortest
: cut the audio or video in case cameraVoip_1_11.flv and screenshare_2_10.flv don't have the same length.
If you want to keep the webcam video and place it in some corner of the video screen sharing:
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
Regarding mapping the cameraVoip__.xml to the correct screenshare__.xml, in case there is more than one:
One could look at the cameraVoip__.xml / screenshare__.xml to get the timestamps of when the audio / screen share video began. This allows to map the screenshare__.xml with the correct cameraVoip__.xml.
E.g., in https://my.adobeconnect.com/p6vwxp2d0c2f/output/p6vwxp2d0c2f.zip?download=zip, from cameraVoip_1_11.xml, line 21:
<String><![CDATA[Thu Feb 07 21:11:23 2019]]></String>
Otherwise, another way could be to sort cameraVoip__.xml / screenshare__.xml, then map the first cameraVoip__.xml with the first screenshare__.xml, the second cameraVoip__.xml with the first screenshare__.xml, etc. I don't know if it'd break in some cases (seems to be ok for the couple of Adobe Connect recordings I looked at but perhaps that's because people always share screens).
I wrote some python script to automate the process:
'''
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'[^ws]','', 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
Didn't try nor read as I won't need this anymore. I accepted the answer as it seems elaborate.
– Guillaume Chevalier
Feb 13 at 6:49
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "3"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsuperuser.com%2fquestions%2f1254845%2fhow-can-i-download-adobe-connect-videos-to-mp4-or-speed-up-listening%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Assume that the Adobe Connect ID is p6vwxp2d0c2f, i.e. the URL is https://my.adobeconnect.com/p6vwxp2d0c2f. As you mentioned in the question, you can add /output/p6vwxp2d0c2f.zip?download=zip
at the end of the URL to download some zip archive containing a bunch of audio and video files as well as some .xml files. E.g., https://my.adobeconnect.com/p6vwxp2d0c2e/output/p6vwxp2d0c2e.zip?download=zip could contain:
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 contains the audio + webcam if any.
- screenshare__.xml contains the audio + webcam if any.
To merge them, you can use ffmpeg
(I took the ffmpeg
commands from Oliver Wang / Yannick Hold-Geoffroy / Aaron Hertzmann):
ffmpeg -i cameraVoip_1_11.flv -i screenshare_2_10.flv -c copy -map 0:a:0 -map 1:v:0 -shortest output.flv
where:
-map 0:a:0
: map the first input file to be used just for the audio.
-map 1:v:0
: map the second input file to be used just for the video.
-shortest
: cut the audio or video in case cameraVoip_1_11.flv and screenshare_2_10.flv don't have the same length.
If you want to keep the webcam video and place it in some corner of the video screen sharing:
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
Regarding mapping the cameraVoip__.xml to the correct screenshare__.xml, in case there is more than one:
One could look at the cameraVoip__.xml / screenshare__.xml to get the timestamps of when the audio / screen share video began. This allows to map the screenshare__.xml with the correct cameraVoip__.xml.
E.g., in https://my.adobeconnect.com/p6vwxp2d0c2f/output/p6vwxp2d0c2f.zip?download=zip, from cameraVoip_1_11.xml, line 21:
<String><![CDATA[Thu Feb 07 21:11:23 2019]]></String>
Otherwise, another way could be to sort cameraVoip__.xml / screenshare__.xml, then map the first cameraVoip__.xml with the first screenshare__.xml, the second cameraVoip__.xml with the first screenshare__.xml, etc. I don't know if it'd break in some cases (seems to be ok for the couple of Adobe Connect recordings I looked at but perhaps that's because people always share screens).
I wrote some python script to automate the process:
'''
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'[^ws]','', 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
Didn't try nor read as I won't need this anymore. I accepted the answer as it seems elaborate.
– Guillaume Chevalier
Feb 13 at 6:49
add a comment |
Assume that the Adobe Connect ID is p6vwxp2d0c2f, i.e. the URL is https://my.adobeconnect.com/p6vwxp2d0c2f. As you mentioned in the question, you can add /output/p6vwxp2d0c2f.zip?download=zip
at the end of the URL to download some zip archive containing a bunch of audio and video files as well as some .xml files. E.g., https://my.adobeconnect.com/p6vwxp2d0c2e/output/p6vwxp2d0c2e.zip?download=zip could contain:
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 contains the audio + webcam if any.
- screenshare__.xml contains the audio + webcam if any.
To merge them, you can use ffmpeg
(I took the ffmpeg
commands from Oliver Wang / Yannick Hold-Geoffroy / Aaron Hertzmann):
ffmpeg -i cameraVoip_1_11.flv -i screenshare_2_10.flv -c copy -map 0:a:0 -map 1:v:0 -shortest output.flv
where:
-map 0:a:0
: map the first input file to be used just for the audio.
-map 1:v:0
: map the second input file to be used just for the video.
-shortest
: cut the audio or video in case cameraVoip_1_11.flv and screenshare_2_10.flv don't have the same length.
If you want to keep the webcam video and place it in some corner of the video screen sharing:
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
Regarding mapping the cameraVoip__.xml to the correct screenshare__.xml, in case there is more than one:
One could look at the cameraVoip__.xml / screenshare__.xml to get the timestamps of when the audio / screen share video began. This allows to map the screenshare__.xml with the correct cameraVoip__.xml.
E.g., in https://my.adobeconnect.com/p6vwxp2d0c2f/output/p6vwxp2d0c2f.zip?download=zip, from cameraVoip_1_11.xml, line 21:
<String><![CDATA[Thu Feb 07 21:11:23 2019]]></String>
Otherwise, another way could be to sort cameraVoip__.xml / screenshare__.xml, then map the first cameraVoip__.xml with the first screenshare__.xml, the second cameraVoip__.xml with the first screenshare__.xml, etc. I don't know if it'd break in some cases (seems to be ok for the couple of Adobe Connect recordings I looked at but perhaps that's because people always share screens).
I wrote some python script to automate the process:
'''
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'[^ws]','', 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
Didn't try nor read as I won't need this anymore. I accepted the answer as it seems elaborate.
– Guillaume Chevalier
Feb 13 at 6:49
add a comment |
Assume that the Adobe Connect ID is p6vwxp2d0c2f, i.e. the URL is https://my.adobeconnect.com/p6vwxp2d0c2f. As you mentioned in the question, you can add /output/p6vwxp2d0c2f.zip?download=zip
at the end of the URL to download some zip archive containing a bunch of audio and video files as well as some .xml files. E.g., https://my.adobeconnect.com/p6vwxp2d0c2e/output/p6vwxp2d0c2e.zip?download=zip could contain:
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 contains the audio + webcam if any.
- screenshare__.xml contains the audio + webcam if any.
To merge them, you can use ffmpeg
(I took the ffmpeg
commands from Oliver Wang / Yannick Hold-Geoffroy / Aaron Hertzmann):
ffmpeg -i cameraVoip_1_11.flv -i screenshare_2_10.flv -c copy -map 0:a:0 -map 1:v:0 -shortest output.flv
where:
-map 0:a:0
: map the first input file to be used just for the audio.
-map 1:v:0
: map the second input file to be used just for the video.
-shortest
: cut the audio or video in case cameraVoip_1_11.flv and screenshare_2_10.flv don't have the same length.
If you want to keep the webcam video and place it in some corner of the video screen sharing:
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
Regarding mapping the cameraVoip__.xml to the correct screenshare__.xml, in case there is more than one:
One could look at the cameraVoip__.xml / screenshare__.xml to get the timestamps of when the audio / screen share video began. This allows to map the screenshare__.xml with the correct cameraVoip__.xml.
E.g., in https://my.adobeconnect.com/p6vwxp2d0c2f/output/p6vwxp2d0c2f.zip?download=zip, from cameraVoip_1_11.xml, line 21:
<String><![CDATA[Thu Feb 07 21:11:23 2019]]></String>
Otherwise, another way could be to sort cameraVoip__.xml / screenshare__.xml, then map the first cameraVoip__.xml with the first screenshare__.xml, the second cameraVoip__.xml with the first screenshare__.xml, etc. I don't know if it'd break in some cases (seems to be ok for the couple of Adobe Connect recordings I looked at but perhaps that's because people always share screens).
I wrote some python script to automate the process:
'''
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'[^ws]','', 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
Assume that the Adobe Connect ID is p6vwxp2d0c2f, i.e. the URL is https://my.adobeconnect.com/p6vwxp2d0c2f. As you mentioned in the question, you can add /output/p6vwxp2d0c2f.zip?download=zip
at the end of the URL to download some zip archive containing a bunch of audio and video files as well as some .xml files. E.g., https://my.adobeconnect.com/p6vwxp2d0c2e/output/p6vwxp2d0c2e.zip?download=zip could contain:
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 contains the audio + webcam if any.
- screenshare__.xml contains the audio + webcam if any.
To merge them, you can use ffmpeg
(I took the ffmpeg
commands from Oliver Wang / Yannick Hold-Geoffroy / Aaron Hertzmann):
ffmpeg -i cameraVoip_1_11.flv -i screenshare_2_10.flv -c copy -map 0:a:0 -map 1:v:0 -shortest output.flv
where:
-map 0:a:0
: map the first input file to be used just for the audio.
-map 1:v:0
: map the second input file to be used just for the video.
-shortest
: cut the audio or video in case cameraVoip_1_11.flv and screenshare_2_10.flv don't have the same length.
If you want to keep the webcam video and place it in some corner of the video screen sharing:
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
Regarding mapping the cameraVoip__.xml to the correct screenshare__.xml, in case there is more than one:
One could look at the cameraVoip__.xml / screenshare__.xml to get the timestamps of when the audio / screen share video began. This allows to map the screenshare__.xml with the correct cameraVoip__.xml.
E.g., in https://my.adobeconnect.com/p6vwxp2d0c2f/output/p6vwxp2d0c2f.zip?download=zip, from cameraVoip_1_11.xml, line 21:
<String><![CDATA[Thu Feb 07 21:11:23 2019]]></String>
Otherwise, another way could be to sort cameraVoip__.xml / screenshare__.xml, then map the first cameraVoip__.xml with the first screenshare__.xml, the second cameraVoip__.xml with the first screenshare__.xml, etc. I don't know if it'd break in some cases (seems to be ok for the couple of Adobe Connect recordings I looked at but perhaps that's because people always share screens).
I wrote some python script to automate the process:
'''
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'[^ws]','', 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
edited Feb 10 at 2:15
answered Feb 9 at 20:07
Franck DernoncourtFranck Dernoncourt
8,3162189169
8,3162189169
Didn't try nor read as I won't need this anymore. I accepted the answer as it seems elaborate.
– Guillaume Chevalier
Feb 13 at 6:49
add a comment |
Didn't try nor read as I won't need this anymore. I accepted the answer as it seems elaborate.
– Guillaume Chevalier
Feb 13 at 6:49
Didn't try nor read as I won't need this anymore. I accepted the answer as it seems elaborate.
– Guillaume Chevalier
Feb 13 at 6:49
Didn't try nor read as I won't need this anymore. I accepted the answer as it seems elaborate.
– Guillaume Chevalier
Feb 13 at 6:49
add a comment |
Thanks for contributing an answer to Super User!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsuperuser.com%2fquestions%2f1254845%2fhow-can-i-download-adobe-connect-videos-to-mp4-or-speed-up-listening%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
This is more of a question for Superuser, so I'm voting to close and move to SU.
– Mark Buffalo
Sep 28 '17 at 22:58
Can it be moved in some way? I don't want to do cross-posting.
– Guillaume Chevalier
Sep 28 '17 at 23:47
I mean, how can it be moved?
– Guillaume Chevalier
Sep 28 '17 at 23:48
One more close vote, and it should happen.
– Mark Buffalo
Sep 29 '17 at 0:41
I'd imagine that viewing the of the videos is recorded in the back-end of the Connect system and tracked to confirm viewing. Downloading the videos would likely prevent this confirmation. You would need to contact the institution's IT people regarding getting the videos, and the instructors and course monitors regarding confirming that you've watched it.
– music2myear
Jan 10 '18 at 19:29