¿Cómo puedo descargar vídeos de Adobe Connect a mp4 o acelerar la escucha?
Ideas:
Hackear mi computadora de alguna manera para acelerar la reproducción del video haciendo que el tiempo pase más rápido en la CPU o algo así para esta aplicación Chrome Flash Player. Creo que esto es posible al menos para el vídeo, y para el sonido, espero que no cambie su tono. Mi sistema operativo es una versión de Linux basada en Debian.
Grabe todo en pantalla, pero esto aún sería tedioso ya que requeriría tener una computadora dedicada funcionando para eso, no podría hacer otra cosa al mismo tiempo.
Descargue los videos utilizando el
/output/filename.zip?download=zip
truco existente que consiste en agregarlo a la URL. Pero esto da como resultado un archivo zip lleno de 17 (o más) archivos duros.flv
que.xml
contienen audio y video separados. Busqué una herramienta para convertirlos nuevamente al video normal y no encontré nada útil. Descubrí que esos archivos molestos y duros son los mismos que ya están descargados en el caché del navegador para la reproducción.Pídale a cada profesor que desbloquee la descarga mp4, como habilitar la posibilidad de usarla
/output/filename.mp4?download=mp4
condownload=mp4
un archivo zip en lugar de un archivo duro. Pero me temo que esto les obligaría a permitir que cualquier persona pueda acceder públicamente a su video en su configuración de administrador, por lo que no estoy seguro de que esta sea una opción para ellos.
Respuesta1
Supongamos que el ID de Adobe Connect es p6vwxp2d0c2f, es decir, la URL eshttps://my.adobeconnect.com/p6vwxp2d0c2f. Como mencionaste en la pregunta, puedes agregar /output/p6vwxp2d0c2f.zip?download=zip
al final de la URL para descargar algún archivo zip que contenga un montón de archivos de audio y video, así como algunos archivos .xml. P.ej,https://my.adobeconnect.com/p6vwxp2d0c2e/output/p6vwxp2d0c2e.zip?download=zippodría contener:
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
- camaraVoip__.xml contiene el audio + la cámara web, si corresponde.
- compartir pantalla__.xml contiene el audio + la cámara web, si corresponde.
Para fusionarlos, puedes usar ffmpeg
(tomé los ffmpeg
comandos de 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
dónde:
-map 0:a:0
: asigna el primer archivo de entrada que se utilizará solo para el audio.-map 1:v:0
: asigna el segundo archivo de entrada para usarlo solo para el video.-shortest
: corta el audio o el vídeo en caso de que cameraVoip_1_11.flv y screenshare_2_10.flv no tengan la misma duración.
Si desea conservar el vídeo de la cámara web y colocarlo en algún rincón de la pantalla de vídeo compartida:
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
Respecto al mapeo de la cámaraVoip__.xml al screenshare_ correcto_.xml, en caso de que haya más de uno:
Se podría mirar la cámaraVoip__.xml/pantalla compartida__.xml para obtener las marcas de tiempo de cuándo comenzó el audio/video compartido de pantalla. Esto permite mapear la pantalla compartida__.xml con la cámara Voip_ correcta_.xml.
Por ejemplo, enhttps://my.adobeconnect.com/p6vwxp2d0c2f/output/p6vwxp2d0c2f.zip?download=zip, de cameraVoip_1_11.xml, línea 21:
<String><![CDATA[Thu Feb 07 21:11:23 2019]]></String>
De lo contrario, otra forma podría ser ordenar cameraVoip__.xml/pantalla compartida__.xml, luego asigne la primera cámaraVoip__.xml con la primera pantalla compartida__.xml, la segunda cámaraVoip__.xml con la primera pantalla compartida__.xml, etc. No sé si se rompería en algunos casos (parece estar bien para el par de grabaciones de Adobe Connect que vi, pero tal vez se deba a que la gente siempre comparte pantallas).
Escribí un script en Python para automatizar el proceso (repositorio de código: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