El lun, 2 oct 2023 a las 8:14, Patagonic Penguin (<pingpata@gmail.com>) escribió:
El vie, 29 sept 2023 a las 22:33, Juan Erbes (<jerbes@gmail.com>) escribió:
El jue, 21 sept 2023 a las 10:02, Juan Erbes (<jerbes@gmail.com>) escribió:
El mié, 20 sept 2023 a las 10:15, Juan Erbes (<jerbes@gmail.com>) escribió:
Hola gente! Hace algunos años compré una cámara Samsung Gear 360 versión 2016. Venía con un software para windows llamado Power Director, con su respectivo número de serie. No encontré el número de serie, pero al conectar la cámara por USB, validó la instalación. El problema surgió después que descargué un video de prueba, que se podía ver en un primer momento, pero luego "se le ocurrió" que debía pagar por un codec para poder renderizar y visualizar los videos.
Luego seguí los pasos de: https://medium.com/@derickdowney/editing-360-video-can-be-free-easy-heres-ho...
E instalé Davinci Resolve, pero me da error con la librería libpango: /opt/resolve/bin/resolve /opt/resolve/bin/resolve: symbol lookup error: /lib64/libpango-1.0.so.0: undefined symbol: g_string_free_and_steal
He encontrado algunas otras alternativas libres: https://ubunlog.com/en/vr180-creator-i-edit-vr-video/
No funciona!
Algunas alternativas libres, pero manuales: https://github.com/bilde2910/stitch-gear360
https://github.com/drNoob13/fisheyeStitcher
https://github.com/google/spatial-media/
https://github.com/drNoob13/fisheyeStitcher/blob/master/utils/grid_xd_yd_384...
https://github.com/ultramango/gear360pano
Iba a comenzar por el primero: https://github.com/bilde2910/stitch-gear360
Pero al ver las dependencias:
ncurses ffmpeg bash fisheyeStitcher spatial-media tools grid_xd_yd_3840x1920.yml.gz located within /usr/share/fisheye-stitcher
The script assumes that you have spatialmedia on your PATH. If you do not have it, create an executable file on your PATH (e.g. /usr/local/bin/spatialmedia) with the following contents:
Ya no se trata de ejecutar solamente un script como stitch-gear360.sh
Finalmente opté por la última opción, compilé fisheyeStitcher, ajusté variables PATH, y renombré el archivo python correspondiente como spatialmedia.
Con VLC se puede reproducir el video 360 sin problemas. Solamente falló la copia del audio, pero no es tan grave.
Hace un par de días regresé de vacaciones y como dice la ley de Murphy: "Si algo puede fallar, va a fallar"
Tenía un presentimiento de la necesidad de chequear los videos grabados con la camara 360, pero olvidé el adaptador para memorias microSD, en el hostel no tenían uno y el primer día hábil era el día del empleado de comercio, así que no chequee los videos hasta descargarlos en mi casa y me encuentro con que a pesar de estar seteada la resolución de video en 3840x1920, los grababa en 2560x1280 y el script stitch-gear360.sh que había puesto a punto con los paths y ejecutables necesarios solamente funciona con videos 3840x1920. Me traicionó la memoria Lexar LSDMI128BB-633A, mientras que las pruebas las había hecho con una memoria Sandisk Ultra de 32 GB y también con la Lexar dieron bien al menos los 2 primeros videos de prueba, pero al quinto video de la camara, bajó la resolución a 2560x1280, aparentemente por problemas de velocidad de escritura. https://www.youtube.com/watch?v=262G4zxxuzY
El software propietario provisto por el fabricante falla al hacer el stitcht de los videos: https://www.samsung.com/us/support/answer/ANS00066650/
Volví a Linux y el software libre y opté por https://github.com/ultramango/gear360pano
Que funciona con otras resoluciones, compilé multiblend, copié el script gear360video.sh gear360video3840.pto gear360pano.cmd gear360sm-c200.pto gear360video2560.pto gear360video4096.pto dentro del path de los binarios /usr/local/bin
Pero el script gear360video.sh me da un error en la linea 85:
#!/usr/bin/env bash
# Script to stitch panoramic videos produced by Samsung Gear360. # Could be adopted to use with other cameras after creating pto file # (Hugin template) # # For help see: # https://github.com/ultramango/gear360pano # # Names: # dec, DEC, decoding - means video -> images # enc, ENC, encoding - means stitched images -> video
############# ### Constants
# http://stackoverflow.com/questions/59895/can-a-bash-script-tell-which-direct... DIR=$(dirname `which $0`) FRAMESTEMPDIRSUFF="frames" OUTTEMPDIRSUFF="out" OUTDIR="$DIR/html/data" # Options, default is the quality option, overridable by speed parameter # Valid value is: 2-31, lower is better FFMPEGQUALITYDEC="-q:v 2" FFMPEGQUALITYENC="-c:v libx265 -crf 18" IMAGETMPLDEC="image%05d.jpg" IMAGETMPLENC="image%05d_pano.jpg" PTOTMPL4096="gear360video4096.pto" PTOTMPL3840="gear360video3840.pto" PTOTMPL2560="gear360video2560.pto" # This is a default, it will/should be overwritten anyway PTOTMPL="$DIR/${PTOTMPL3840}" TMPAUDIO="tmpaudio.aac" TMPVIDEO="tmpvideo.mp4" # Throttle parallel processing to give some room for other processes # See: https://www.gnu.org/software/parallel/parallel_tutorial.html#Limiting-the-re... PARALLELEXTRAOPTS="--load 99% --noswap --memfree 500M" # Debug, yes = print debug messages DEBUG="no" # Global flag if temporary directories should be removed CLEANUP="yes"
############# ### Functions
# Debug, arguments: # 1. Text to print print_debug() { if [ "$DEBUG" == "yes" ]; then echo "DEBUG: $@" fi }
# Clean-up function clean_up() { if [ "$CLEANUP" == "yes" ]; then echo "Removing temporary directories..." if [ -d "$FRAMESTEMPDIR" ]; then print_debug "Removing frames directory: $FRAMESTEMPDIR" rm -rf "$FRAMESTEMPDIR" fi if [ -d "$OUTTEMPDIR" ]; then print_debug "Removing output directory: $OUTTEMPDIR" rm -rf "$OUTTEMPDIR" fi else echo "Keeping temporary directories..." echo "Frames temp directory: $FRAMESTEMPDIR" echo "Output temp directory: $OUTTEMPDIR" fi }
# Function to run a command and check the result # http://stackoverflow.com/questions/5195607/checking-bash-exit-status-of-seve... run_command() { # Remove empty arguments (it will confuse the executed command) local cmd=("$@") for i in "${!cmd[@]}"; do [ -n "${cmd[$i]}" ] || unset "cmd[$i]" done
print_debug "Running command: " "${cmd[@]}" "${cmd[@]}" local status=$? if [ $status -ne 0 ]; then # We failed, inform the user and clean-up echo "Error while running $1" >&2 if [ $1 != "notify-send" ]; then # Display error in a nice graphical popup if available run_command notify-send -a $0 "Error while running $1" fi clean_up exit 1 fi return $status }
# Print help for the user print_help() { echo -e "\nSmall script to stitch raw panoramic videos." echo "Raw meaning two fisheye images side by side." echo -e "Script originally writen for Samsung Gear 360.\n" echo -e "Usage:\n$0 [options] infile [outfile]\n" echo "Where infile is a panoramic video file, output" echo "parameter is optional. Video file will be written" echo "to a file with appended _pano, ex.: dummy.mp4 will" echo -e "be stitched to dummy_pano.mp4.\n" echo "-o|--output DIR will set the output directory of panoramas" echo " default: html/data" echo "-p|--parallel use GNU Parallel to speed-up processing" echo "-s|--speed optimise for speed (lower quality)" echo "-t|--temp DIR set temporary directory (default: system's" echo " temporary directory)" echo "-h|--help prints this help" }
check_preconditions() { # Check if we have the software to do it # http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-b... local error=0
type nona >/dev/null 2>&1 || { echo >&2 "Hugin required but it is not installed. Aborting."; exit 1; } type ffmpeg >/dev/null 2>&1 || { echo >&2 "ffmpeg required but it's not installed. Will abort."; error=1; } type multiblend >/dev/null 2>&1 || { echo >&2 "multiblend required but it's not installed. Will abort."; error=1; }
# Use parallel? Check if we have it # https://stackoverflow.com/questions/3601515/how-to-check-if-a-variable-is-se... if [ ! -z "${USEPARALLEL+x}" ]; then type parallel >/dev/null 2>&1 || { echo >&2 "GNU Parallel use enabled but it's not installed. Will abort."; error=1; } fi
if [ $error -ne 0 ]; then exit 1 fi }
###################### ### "Main" starts here
# Check required argument(s) if [ -z "${1+x}" ]; then print_help run_command notify-send -a $0 "Please provide an input file." exit 1 fi
# Process command line options. Source (modified): # https://stackoverflow.com/questions/192249/how-do-i-parse-command-line-argum... while [[ $# -gt 0 ]] do key="$1"
case $key in -h|--help) print_help shift exit 0 ;; -o|--output) OUTDIR="$2" if [ ! -d "$2" ]; then echo "Given output ($2) is not a directory, cannot continue" exit 1 fi shift shift ;; -p|--parallel) # Switch to use parallel USEPARALLEL=1 print_debug "Use of GNU Parallel enabled" shift ;; -t|--temp) if [ -d "$2" ]; then TEMPDIRPREFIX="$2" else echo "Given temporary ($2) is not a directory, using default" fi shift shift ;; -s|--speed) FFMPEGQUALITYDEC="" FFMPEGQUALITYENC="-c:v libx264 -preset ultrafast" shift ;; *) break ;; esac done
# Output name as second argument plus output directory if [ -z "${2+x}" ]; then # If invoked by nautilus open-with, we need to remember the proper directory in the outname OUTNAME=$OUTDIR/`basename "${1%.*}"`_pano.mp4 print_debug "Output filename: $OUTNAME" else OUTNAME=$OUTDIR/`basename $2` fi
# Check if software is installed check_preconditions
# Start counting time STARTTS=`date +%s`
# Handle temporary directories if [ -n "$TEMPDIRPREFIX" ]; then # On some systems not using '-p .' (temp in current dir) might cause problems FRAMESTEMPDIR=`mktemp -d -p $TEMPDIRPREFIX` OUTTEMPDIR=`mktemp -d -p $TEMPDIRPREFIX` else FRAMESTEMPDIR=`mktemp -d` OUTTEMPDIR=`mktemp -d` fi
# Extract frames from video run_command notify-send -a $0 "Starting panoramic video stitching..." echo "Extracting frames from video (this might take a while)..." # Note: anything in quotes will be treated as one single option run_command "ffmpeg" "-y" "-i" "$1" $FFMPEGQUALITYDEC "$FRAMESTEMPDIR/$IMAGETMPLDEC"
# Detect video size (http://trac.ffmpeg.org/wiki/FFprobeTips) eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width "$1") SRCVIDEOSIZE=${streams_stream_0_width}:${streams_stream_0_height} print_debug "Input video size: ${SRCVIDEOSIZE}"
# Detect video size and select appriopriate pto file case $SRCVIDEOSIZE in 4096:2048) PTOTMPL=$PTOTMPL4096 ;; 3840:1920) PTOTMPL=$PTOTMPL3840 ;; 2560:1280) PTOTMPL=$PTOTMPL2560 ;; *) PTOTMPL=$PTOTMPL3840 ;; esac print_debug "PTO template: ${PTOTMPL}"
# Stitch frames export -f run_command print_debug clean_up echo "Stitching frames..." if [ -z "${USEPARALLEL+x}" ]; then # No parallel find $FRAMESTEMPDIR -type f -name '*.jpg' | xargs -Ipanofile bash -c "run_command \"$DIR/gear360pano.sh\" -r -m -o \"$OUTTEMPDIR\" \"panofile\" \"$PTOTMPL\"" else # Use parallel find $FRAMESTEMPDIR -type f -name '*.jpg' | parallel $PARALLELEXTRAOPTS --bar run_command "$DIR/gear360pano.sh" -r -m -o "$OUTTEMPDIR" {} "$PTOTMPL" fi
# Put stitched frames together echo "Recoding the video..." # Detect source FPS (probe streams until some sane fps found, naive but should work) for streamno in {0..5}; do SRCFPSSTR=`ffprobe -v fatal -of default=noprint_wrappers=1:nokey=1 -select_streams $streamno -show_entries stream=r_frame_rate "$1"` print_debug "Stream: $streamno FPS: $SRCFPSSTR" if [ $SRCFPSSTR != "0/0" ]; then break; fi done if [ $streamno -eq 5 ]; then print_debug "Couldn't find FPS, assuming 30000/1001" SRCFPSSTR="30000/1001" fi
print_debug "Input video FPS: ${SRCFPSSTR}"
# Re-encode video back with stitched images run_command ffmpeg -y -f image2 -framerate ${SRCFPSSTR} -i "$OUTTEMPDIR/$IMAGETMPLENC" -r "${SRCFPSSTR}" -s "${SRCVIDEOSIZE}" $FFMPEGQUALITYENC "$OUTTEMPDIR/$TMPVIDEO"
# Check if there's audio present (https://stackoverflow.com/questions/21446804/find-if-video-file-has-audio-pr...) SRCHASAUDIO=`ffprobe -v fatal -of default=nw=1:nk=1 -show_streams -select_streams a -show_entries stream=codec_type "$1"` print_debug "Input video has audio: ${SRCHASAUDIO}"
if [ -n "$SRCHASAUDIO" ]; then echo "Extracting audio..." run_command notify-send -a $0 "Extracting audio from source video..." run_command ffmpeg -y -i "$1" -vn -acodec copy "$OUTTEMPDIR/$TMPAUDIO"
echo "Merging audio..." run_command notify-send -a $0 "Merging audio with final video..." run_command ffmpeg -y -i "$OUTTEMPDIR/$TMPVIDEO" -i "$OUTTEMPDIR/$TMPAUDIO" -c:v copy -c:a aac -strict experimental "$OUTNAME" else print_debug "No audio detected (timelapse video?), continuing..." mv "$OUTTEMPDIR/$TMPVIDEO" "$OUTNAME" fi
# Remove temporary directories clean_up
# Inform user about the result ENDTS=`date +%s` RUNTIME=$((ENDTS-STARTTS)) echo Video written to $OUTNAME, took: $RUNTIME s run_command notify-send -a $0 "'Conversion complete. Video written to $OUTNAME, took: $RUNTIME s'" exit 0
¿Alguna idea?
Si no funciona el software de código abierto, pudieras probar con software propietario!
Como nadie respondía, opté por preguntarle a "alguien que suele responder" sobre el script, y respondió esto: "El error que estás viendo, "línea 85: notify-send: orden no encontrada", significa que el comando notify-send no se encuentra disponible en el sistema en el momento en que se ejecuta el script. notify-send se utiliza para mostrar notificaciones en el escritorio, y parece que no está instalado en tu sistema o no está en la ruta de búsqueda del script. Para solucionar este problema, puedes hacer lo siguiente: Verifica si notify-send está instalado en tu sistema. En la mayoría de las distribuciones de Linux, notify-send está incluido en el paquete "libnotify" o "notify-send". Puedes instalarlo usando el administrador de paquetes de tu distribución. Por ejemplo, en Ubuntu, puedes usar: bash Copy code sudo apt-get install libnotify-bin Asegúrate de que el directorio donde se encuentra notify-send esté en la variable PATH. Puedes agregarlo al script antes de la línea que genera el error. Por ejemplo: bash Copy code export PATH="$PATH:/ruta/al/directorio" Reemplaza "/ruta/al/directorio" con la ubicación real de notify-send. Si no deseas utilizar notificaciones en el escritorio, puedes comentar o eliminar la línea 85 en el script: bash Copy code # run_command notify-send -a $0 "Error while running $1" Esto evitará que el script intente ejecutar notify-send. Después de realizar cualquiera de estas acciones, el error relacionado con notify-send debería desaparecer. Asegúrate también de haber instalado las dependencias requeridas, como "Hugin", "ffmpeg" y "multiblend", como se especifica en el script, para que el script funcione correctamente." El comentar la linea: # run_command notify-send -a $0 "Error while running $1" Hacía que el script se bloquee, por las instrucciones vinculadas dentro del mismo bucle. Verifiqué si estaba instalado el paquete "libnotify" y lo estaba, instalé libnotify-tools y se solucionó el problema. Pero había otros problemas, por ejemplo que no encontraba una librería libcuda y otros como un ejecutable del paquete Hugin llamado "nona", que sería el responsable de "cocer" las 2 imágenes de cada cuadro de video. Probablemente fallaba "nona" por la falta de la librería libcuda. Estudié otra alternativa, ya que además debía realizar la estabilización del video 360: https://github.com/SuTanTank/VideoStitchingViaShakinessRemoving Pero viendo todos los requisitos a cumplir: Shankar Rao's Motion Segmentation Code: http://perception.csl.illinois.edu/coding/motion/#Software CVX: http://cvxr.com/cvx/ vlfeat: http://www.vlfeat.org/ peter kovesi matlab toolbox: http://www.peterkovesi.com/matlabfns/ Liu Shuaicheng's As-similar-as-possible Warping code: http://www.liushuaicheng.org/SIGGRAPH2013/index.htm Me dí por vencido! Entonces decidí intentar con software propietarios, pero al igual que el software provisto por Samsung tanto para windows como para android ya no funcionan mas por incompatibilidades de versiones. Con Autopano 3.0: https://www.youtube.com/watch?v=HeiElNRvhnA Pero ya no funciona con windows 10 ni bajo Linux con wine. Con Insta360 stitcher: https://www.youtube.com/watch?v=6TANeUo8aIA Pero el programa buscaba determinado archivo de las camaras Insta360, que no estaba presente entre los de la Samsung Gear 360. Finalmente, en un foro vi algo de la firma Magix, que es la que desarrolla el "Sony Vegas" para Sony: https://www.magix.com/es/edicion-de-video/video-deluxe/comprar/ Realmente, viendo los precios no es demasiado caro, aunque en modo de prueba lo puedo utilizar durante 30 días, con la limitación de renderizar como máximo 3 minutos. El stitching 360 aparece como otro efecto, y tiene como opción seleccionar el modelo de cámara Samsung Gear 360 para fijar los parámetros del stitching, además de contar con 2 efectos de estabilización de video 360, uno de ellos denominado Vegas. No se si es por el mismo problema de la velocidad de grabación de la memoria de la camara, por el cual también me redujo la resolución de 3840x1920 a 2560x1280, porque me cortaba el video en clips de 1 minuto, y dada la limitación del tiempo de renderizado a 3 minutos, opté por armar cada video con clips de 1 minuto, y aquí les dejo el primero de ellos: https://www.youtube.com/watch?v=8hBPhE2jQ_I Salu2