Astroport.ONE/tools/vlc_webcam.sh

217 lines
10 KiB
Bash
Raw Permalink Normal View History

#!/bin/bash
################################################################################
# Author: Fred (support@qo-op.com)
# Version: 0.1
# License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/)
################################################################################
MY_PATH="`dirname \"$0\"`" # relative
MY_PATH="`( cd \"$MY_PATH\" && pwd )`" # absolutized and normalized
2022-12-29 14:51:05 +01:00
. "$MY_PATH/my.sh"
2023-12-31 04:05:06 +01:00
## REDIRECT LOG
exec 2>&1 >> ~/.zen/tmp/ajouter_media.log
PLAYER="$1"
2022-11-03 20:11:17 +01:00
[[ ${PLAYER} == "" ]] && PLAYER=$(cat ~/.zen/game/players/.current/.player 2>/dev/null)
[[ ${PLAYER} == "" ]] && espeak "ERROR PLAYER - EXIT" && exit 1
PSEUDO=$(cat ~/.zen/game/players/${PLAYER}/.pseudo 2>/dev/null)
[[ $G1PUB == "" ]] && G1PUB=$(cat ~/.zen/game/players/${PLAYER}/.g1pub 2>/dev/null)
[[ $G1PUB == "" ]] && espeak "ERROR G1PUB - EXIT" && exit 1
2022-11-03 20:11:17 +01:00
ASTRONAUTENS=$(ipfs key list -l | grep -w ${PLAYER} | cut -d ' ' -f1)
2022-11-03 20:11:17 +01:00
[[ ! $ASTRONAUTENS ]] && echo "${PLAYER} CLEF IPNS INTROUVABLE - EXIT -" && exit 1
2022-12-29 14:51:05 +01:00
YOU=$(myIpfsApi)
LIBRA=$(myIpfsGw)
2022-10-31 17:22:40 +01:00
mkdir -p ~/.zen/game/players/${PLAYER}/vlog
2022-03-17 21:44:07 +01:00
screencapture(){
vlc \
-i screen://\
2022-03-17 21:44:07 +01:00
--sout "#transcode{vcodec=h264,vb=800,fps=5,scale=1,acodec=none}:duplicate{dst=std{access=file,mux=mp4,dst='${HOME}/Screencapture $(date +%Y-%m-%d) at $(date +%H.%M.%S).mp4'}}"
deskid="$!"
}
2022-03-13 00:10:32 +01:00
if [[ -f ~/.zen/soundrecord.config ]]; then
source ~/.zen/soundrecord.config
else
RECDEVICE=$(pactl list short sources | grep input | cut -f 2)
fi
2022-03-17 21:44:07 +01:00
mkdir -p ~/.zen/tmp/
2022-11-01 16:16:22 +01:00
espeak "Hello"
2022-11-19 21:28:00 +01:00
if [[ ! -s ~/.zen/game/players/${PLAYER}/ipfs/G1SSB/_g1.pubkey ]]; then
espeak "Getting player latest TW. please wait."
## GETTING LAST TW via IPFS or HTTP GW
2024-04-02 11:49:53 +02:00
[[ $YOU ]] \
&& echo "$myIPFS/ipns/${ASTRONAUTENS} ($YOU)" \
&& ipfs --timeout 12s cat --progress=false /ipns/${ASTRONAUTENS} > ~/.zen/tmp/vlc_webcam.html
[[ ! -s ~/.zen/tmp/vlc_webcam.html ]] \
&& echo "$LIBRA/ipns/${ASTRONAUTENS}" \
&& curl -m 12 -so ~/.zen/tmp/vlc_webcam.html "$LIBRA/ipns/${ASTRONAUTENS}"
[[ ! -s ~/.zen/tmp/vlc_webcam.html ]] \
&& espeak "WARNING. impossible to find your TW online"
[[ ! -s ~/.zen/game/players/${PLAYER}/ipfs/moa/index.html ]] \
&& espeak "FATAL ERROR. No local copy found !" \
&& exit 1
[[ -s ~/.zen/tmp/vlc_webcam.html ]] \
&& cp -f ~/.zen/tmp/vlc_webcam.html ~/.zen/game/players/${PLAYER}/ipfs/moa/index.html \
&& espeak "OK DONE"
2022-11-19 21:28:00 +01:00
fi
espeak "Start Video recording. Press ENTER to stop !"
# Find "input-slave" :: pactl list short sources
2022-03-13 00:10:32 +01:00
# RECTIME=12
# ${MY_PATH}/displaytimer.sh 12 &
# timeout $RECTIME cvlc v4l2:///dev/video0:width=640:height=480 --input-slave=pulse://alsa_input.usb-HD_Web_Camera_HD_Web_Camera_Ucamera001-02.analog-mono --sout "#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=file,mux=mp4,dst=\"$HOME/.zen/tmp/MyVid.mp4\"}"
2022-03-13 00:10:32 +01:00
cvlc v4l2:///dev/video0:width=640:height=480 --input-slave=pulse://$RECDEVICE --sout "#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=file,mux=mp4,dst=\"$HOME/.zen/tmp/MyVid.mp4\"}" &
processid="$!"
2022-11-03 20:11:17 +01:00
2022-03-13 00:10:32 +01:00
echo "Press ENTER to stop video recording"
2022-11-03 20:11:17 +01:00
[[ $(echo $DISPLAY | cut -d ':' -f 1) == "" ]] && zenity --warning --width 360 --text "(◕‿‿◕) STOP... " || read
2022-03-13 00:10:32 +01:00
kill -15 $processid
# cvlc v4l2:///dev/video0:width=640:height=480 --input-slave=pulse://alsa_input.usb-HD_Web_Camera_HD_Web_Camera_Ucamera001-02.analog-mono --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=file,mux=mp4,dst='~/.zen/tmp/MyVid.mp4'}' --run-time=$RECTIME --stop-time=$RECTIME cvlc://quit
2024-05-01 13:25:37 +02:00
## RECOMMENCER ?
sleep 3
2022-06-23 19:16:29 +02:00
espeak "video transcoding" #-acodec aac
2022-04-06 17:12:40 +02:00
# Ecran vert : ffmpeg -i input.mp4 -i greenscreen.mp4 -filter_complex '[1:v]colorkey=color=00FF00:similarity=0.85:blend=0.0[ckout];[0:v][ckout]overlay[out]' -map '[out]' output.mp4
rm -f ~/.zen/tmp/output.mp4
2022-11-16 00:29:08 +01:00
ffmpeg -loglevel quiet -i ~/.zen/tmp/MyVid.mp4 -vcodec libx264 -loglevel quiet ~/.zen/tmp/output.mp4
2022-08-24 15:10:56 +02:00
## Create short gif
rm -f ~/.zen/tmp/screen.gif
2022-11-16 00:29:08 +01:00
ffmpeg -loglevel quiet -ss 1.0 -t 1.6 -loglevel quiet -i ~/.zen/tmp/output.mp4 ~/.zen/tmp/screen.gif
2022-11-03 20:11:17 +01:00
ANIMH=$(ipfs add -q ~/.zen/tmp/screen.gif)
2022-08-24 15:10:56 +02:00
2022-04-06 17:12:40 +02:00
# Conversion HLS
2022-11-01 14:41:30 +01:00
ffmpeg -loglevel quiet -i ~/.zen/tmp/output.mp4 -codec: copy -start_number 0 -hls_time 10 -hls_list_size 0 -f hls ~/.zen/tmp/output.m3u8
2022-10-20 11:55:57 +02:00
## ADDING TO IPFS
[[ ! -s ~/.zen/tmp/output.mp4 ]] && espeak "Sorry no video file found" && exit 1
2022-10-31 14:54:28 +01:00
IPFSID=$(ipfs add -wHq ~/.zen/tmp/output.mp4 | tail -n 1)
echo "NEW VIDEO FILE /ipfs/$IPFSID/output.mp4"
echo "FOUND : ~/.zen/tmp/output.mp4"
FILE_BSIZE=$(du -b "$HOME/.zen/tmp/output.mp4" | awk '{print $1}')
FILE_SIZE=$(echo "${FILE_BSIZE}" | awk '{ split( "B KB MB GB TB PB" , v ); s=1; while( $1>1024 ){ $1/=1024; s++ } printf "%.2f %s", $1, v[s] }')
espeak "FILE SIZE = $FILE_SIZE"
2022-06-23 19:16:29 +02:00
espeak "OK"
2022-10-31 17:22:40 +01:00
mkdir -p ~/.zen/game/players/${PLAYER}/vlog
## Creating new video chain index.html
2022-10-31 17:22:40 +01:00
OLDID=$(cat ~/.zen/game/players/${PLAYER}/.vlog.index 2>/dev/null)
if [[ $OLDID ]]; then
2022-10-31 17:22:40 +01:00
sed s/_OLDID_/$OLDID/g ${MY_PATH}/../templates/video_chain.html > ~/.zen/game/players/${PLAYER}/vlog/${MOATS}.index.html
sed -i s/_IPFSID_/$IPFSID/g ~/.zen/game/players/${PLAYER}/vlog/${MOATS}.index.html
else
2022-10-31 17:22:40 +01:00
sed s/_IPFSID_/$IPFSID/g ${MY_PATH}/../templates/video_first.html > ~/.zen/game/players/${PLAYER}/vlog/${MOATS}.index.html
fi
2022-11-01 14:41:30 +01:00
sed -i "s~_DATE_~$(date -u "+%Y-%m-%d#%H:%M:%S")~g" ~/.zen/game/players/${PLAYER}/vlog/${MOATS}.index.html
2022-11-03 20:11:17 +01:00
sed -i "s~_PLAYER_~${PLAYER}~g" ~/.zen/game/players/${PLAYER}/vlog/${MOATS}.index.html
sed -i "s~_ANIMH_~${ANIMH}~g" ~/.zen/game/players/${PLAYER}/vlog/${MOATS}.index.html
2022-03-13 00:10:32 +01:00
2022-11-01 14:41:30 +01:00
mv ~/.zen/game/players/${PLAYER}/vlog/${MOATS}.index.html ~/.zen/game/players/${PLAYER}/vlog/index.html
2022-03-17 21:44:07 +01:00
2022-10-31 17:22:40 +01:00
IPFSROOT=$(ipfs add -rHq ~/.zen/game/players/${PLAYER}/vlog | tail -n 1)
echo $IPFSROOT > ~/.zen/game/players/${PLAYER}/.vlog.index
2022-03-17 21:44:07 +01:00
2022-12-29 14:51:05 +01:00
echo "NEW VIDEO $myIPFS/ipfs/$IPFSROOT"
2022-11-01 14:41:30 +01:00
###########################
## AJOUT VIDEO ASTROPORT TW
###########################
2022-11-01 16:16:22 +01:00
2022-08-24 15:10:56 +02:00
MEDIAID=$(date -u +"%Y%m%d%H%M%S%4N")
mkdir -p ~/Astroport/${PLAYER}/video/vlog/
2022-08-18 03:47:49 +02:00
MEDIAKEY="VLOG_${PLAYER}_${MEDIAID}"
cp ~/.zen/tmp/output.mp4 ~/Astroport/${PLAYER}/video/vlog/${PLAYER}_$MEDIAID.mp4
2022-08-24 15:10:56 +02:00
REAL=$(file --mime-type -b "$HOME/Astroport/${PLAYER}/video/vlog/${PLAYER}_$MEDIAID.mp4")
2022-08-18 03:47:49 +02:00
2022-08-24 15:10:56 +02:00
## TW not displaying direct ipfs video link (only image, pdf, ...) so insert <video> html tag
2022-11-16 07:42:44 +01:00
TEXT="<video controls width=100% poster='/ipfs/"${ANIMH}"'><source src='/ipfs/"${IPFSID}"/output.mp4' type='"${REAL}"'></video><h1><a href='/ipfs/"${IPFSROOT}"'>VLOG ("${MEDIAID}") Story</a></h1><br>
2022-10-31 17:22:40 +01:00
<\$button class='tc-tiddlylink'><\$list filter='[tag[G1Vlog]]'><\$action-navigate \$to=<<currentTiddler>> \$scroll=no/></\$list>Afficher tous les G1Vlog</\$button>"
2022-08-18 03:47:49 +02:00
echo "## Creation json tiddler"
echo '[
{
2022-11-13 04:06:32 +01:00
"created": "'${MOATS}'",
2022-11-03 20:11:17 +01:00
"title": "'VLOG_${MEDIAID} ${PSEUDO}'",
2022-08-18 03:47:49 +02:00
"text": "'${TEXT}'",
2022-08-24 15:10:56 +02:00
"type": "'text/vnd.tiddlywiki'",
2022-08-18 03:47:49 +02:00
"mediakey": "'${MEDIAKEY}'",
"mime": "'${REAL}'",
2022-10-31 17:22:40 +01:00
"story": "'/ipfs/${IPFSROOT}'",
"size": "'${FILE_BSIZE}'",
2022-10-31 17:22:40 +01:00
"ipfs": "'/ipfs/${IPFSID}/output.mp4'",
"gifanime": "'/ipfs/${ANIMH}'",
2022-10-20 11:55:57 +02:00
"player": "'${PLAYER}'",
2022-11-15 14:34:36 +01:00
"tags": "'${PLAYER} G1Vlog vlog ipfs'",
"modified": "'${MOATS}'"
2022-08-18 03:47:49 +02:00
}
]
2022-10-31 17:22:40 +01:00
' > ~/.zen/game/players/${PLAYER}/vlog/${MEDIAKEY}.dragdrop.json
2022-08-24 15:10:56 +02:00
# LOG
2022-10-31 17:22:40 +01:00
cat ~/.zen/game/players/${PLAYER}/vlog/${MEDIAKEY}.dragdrop.json | jq
cp ~/.zen/game/players/${PLAYER}/vlog/${MEDIAKEY}.dragdrop.json ~/Astroport/${PLAYER}/video/vlog/
2022-08-24 15:10:56 +02:00
## Adding tiddler to PLAYER TW
ASTRONAUTENS=$(ipfs key list -l | grep -w "${PLAYER}" | cut -d ' ' -f 1)
rm -f ~/.zen/tmp/newindex.html
2022-12-29 14:51:05 +01:00
echo "Nouveau TID dans TW ${PSEUDO} : $myIPFS/ipns/$ASTRONAUTENS"
2022-11-03 20:11:17 +01:00
tiddlywiki --load ~/.zen/game/players/${PLAYER}/ipfs/moa/index.html \
2022-10-31 17:22:40 +01:00
--import ~/.zen/game/players/${PLAYER}/vlog/${MEDIAKEY}.dragdrop.json "application/json" \
2022-08-24 15:10:56 +02:00
--output ~/.zen/tmp --render "$:/core/save/all" "newindex.html" "text/plain"
if [[ -s ~/.zen/tmp/newindex.html ]]; then
espeak "Updating your TW"
echo "PLAYER TW Update..."
2022-11-03 20:11:17 +01:00
echo "Mise à jour ~/.zen/game/players/${PLAYER}/ipfs/moa/index.html"
DIFF=$(diff ~/.zen/tmp/newindex.html ~/.zen/game/players/${PLAYER}/ipfs/moa/index.html)
cp -f ~/.zen/tmp/newindex.html ~/.zen/game/players/${PLAYER}/ipfs/moa/index.html
2022-08-24 15:10:56 +02:00
2022-11-03 20:11:17 +01:00
[[ $DIFF ]] && cp ~/.zen/game/players/${PLAYER}/ipfs/moa/.chain \
~/.zen/game/players/${PLAYER}/ipfs/moa/.chain.$(cat ~/.zen/game/players/${PLAYER}/ipfs/moa/.moats)
2022-10-20 11:55:57 +02:00
2022-11-03 20:11:17 +01:00
TW=$(ipfs add -Hq ~/.zen/game/players/${PLAYER}/ipfs/moa/index.html | tail -n 1)
2022-11-20 12:57:41 +01:00
ipfs name publish --allow-offline -t 24h --key=${PLAYER} /ipfs/$TW
2022-10-20 11:55:57 +02:00
2022-11-03 20:11:17 +01:00
[[ $DIFF ]] && echo $TW > ~/.zen/game/players/${PLAYER}/ipfs/moa/.chain
echo $MOATS > ~/.zen/game/players/${PLAYER}/ipfs/moa/.moats
2022-08-24 15:10:56 +02:00
2022-11-03 20:11:17 +01:00
espeak "Hip Hip Hip Hurray"
2022-10-20 11:55:57 +02:00
2022-12-29 14:51:05 +01:00
xdg-open "$myIPFS/ipns/$ASTRONAUTENS/#:[days:created[-1]tag[G1Vlog]]"
2022-11-07 01:37:17 +01:00
2022-10-20 11:55:57 +02:00
echo "================================================"
2022-12-29 14:51:05 +01:00
echo "${PLAYER} : $myIPFS/ipns/$ASTRONAUTENS/#:[days:created[-1]tag[G1Vlog]]"
2022-10-20 11:55:57 +02:00
echo "================================================"
2022-08-24 15:10:56 +02:00
echo
else
espeak "Shit hit the fan baby. Sorry something went wrong."
2022-08-24 15:10:56 +02:00
echo "Une erreur est survenue lors de l'ajout du tiddler VLOG à votre TW"
fi
2022-12-29 14:51:05 +01:00
echo "${PSEUDO} TW VLOG : $myIPFS/ipns/$ASTRONAUTENS/#VLOG_${MEDIAID}"
2022-08-18 03:47:49 +02:00
# ~/.zen/astrXbian/zen/new_file_in_astroport.sh "$HOME/Astroport/${PLAYER}/video/${MEDIAID}/" "output.mp4" "$G1PUB"
# https://stackoverflow.com/questions/49846400/raspberry-pi-use-vlc-to-stream-webcam-logitech-c920-h264-video-without-tran
# record to MKV cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=file,mux=mkv,dst='~/.zen/tmp/Webcam_Record/MyVid.mkv'}'
# record to MP4 cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=file,mux=mp4,dst='~/.zen/tmp/Webcam_Record/MyVid.mp4'}'
# record + stream cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:duplicate{dst=standard{access=file,mux=mp4,dst='~/.zen/tmp/Webcam_Record/MyVid.mp4'},dst=standard{access=http,mux=ts,mime=video/ts,dst=:8099}}'