{"id":1406,"date":"2013-02-21T19:14:29","date_gmt":"2013-02-22T03:14:29","guid":{"rendered":"https:\/\/surfrock66.com\/?p=1406"},"modified":"2013-02-26T11:49:08","modified_gmt":"2013-02-26T19:49:08","slug":"bash-script-to-clip-ripped-home-movies","status":"publish","type":"post","link":"https:\/\/surfrock66.com\/?p=1406","title":{"rendered":"Bash Script to Clip Ripped Home Movies"},"content":{"rendered":"<p>Bash script I wrote to assist in clipping home movies.  Still some more to do, but here's a summary.<\/p><p>Particularly useful was the code I used to find the difference under bash between start and end points using date...and keeping the result in a format ffmpeg could understand.<\/p>\n<p><code>#!\/bin\/bash&lt;br \/&gt;\n#&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;Title:&amp;nbsp;HomeMoviesClipper.sh&lt;br \/&gt;\n#&amp;nbsp;Description:&amp;nbsp;Use&amp;nbsp;ffmpeg&amp;nbsp;to&amp;nbsp;split&amp;nbsp;raw&amp;nbsp;home&amp;nbsp;movie&amp;nbsp;captures&amp;nbsp;into&amp;nbsp;clips&lt;br \/&gt;\n#&amp;nbsp;Original&amp;nbsp;Author:&amp;nbsp;Joseph&amp;nbsp;Gullo&amp;nbsp;(surfrock66)&amp;nbsp;(surfrock66@surfrock66.com)&lt;br \/&gt;\n#&lt;br \/&gt;\n#&amp;nbsp;This&amp;nbsp;script&amp;nbsp;works&amp;nbsp;with&amp;nbsp;a&amp;nbsp;very&amp;nbsp;specific&amp;nbsp;set&amp;nbsp;of&amp;nbsp;constraints&amp;nbsp;and&amp;nbsp;formats&amp;nbsp;to&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;take&amp;nbsp;raw&amp;nbsp;video&amp;nbsp;captures&amp;nbsp;and&amp;nbsp;split&amp;nbsp;them&amp;nbsp;into&amp;nbsp;clips&amp;nbsp;of&amp;nbsp;events.&amp;nbsp;&amp;nbsp;Each&amp;nbsp;of&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;these&amp;nbsp;movies&amp;nbsp;was&amp;nbsp;captured,&amp;nbsp;using&amp;nbsp;a&amp;nbsp;Dazzle&amp;nbsp;USB&amp;nbsp;video&amp;nbsp;capture&amp;nbsp;device,&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;into&amp;nbsp;h264&amp;nbsp;video&amp;nbsp;and&amp;nbsp;mp3&amp;nbsp;audio,&amp;nbsp;using&amp;nbsp;VLC.&amp;nbsp;&amp;nbsp;These&amp;nbsp;original&amp;nbsp;tapes&amp;nbsp;were&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;typically&amp;nbsp;close&amp;nbsp;to&amp;nbsp;2&amp;nbsp;hours&amp;nbsp;long,&amp;nbsp;however&amp;nbsp;capture&amp;nbsp;was&amp;nbsp;often&amp;nbsp;left&amp;nbsp;to&amp;nbsp;run,&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;creating&amp;nbsp;videos&amp;nbsp;that&amp;nbsp;were&amp;nbsp;8+&amp;nbsp;hours&amp;nbsp;long.&amp;nbsp;&amp;nbsp;The&amp;nbsp;capture&amp;nbsp;device&amp;nbsp;produced&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;video&amp;nbsp;that&amp;nbsp;was&amp;nbsp;480x480&amp;nbsp;and&amp;nbsp;audio&amp;nbsp;that&amp;nbsp;only&amp;nbsp;contains&amp;nbsp;1&amp;nbsp;channel&amp;nbsp;(recorded&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;through&amp;nbsp;stereo),&amp;nbsp;and&amp;nbsp;the&amp;nbsp;output&amp;nbsp;video&amp;nbsp;will&amp;nbsp;retain&amp;nbsp;this.&amp;nbsp;&amp;nbsp;The&amp;nbsp;desired&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;format&amp;nbsp;is&amp;nbsp;high-bitrate&amp;nbsp;h264&amp;nbsp;and&amp;nbsp;aac&amp;nbsp;audio,&amp;nbsp;encapsulated&amp;nbsp;in&amp;nbsp;.mp4&amp;nbsp;files.&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;This&amp;nbsp;script&amp;nbsp;also&amp;nbsp;works&amp;nbsp;within&amp;nbsp;a&amp;nbsp;predictable&amp;nbsp;directory&amp;nbsp;environment&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;because&amp;nbsp;of&amp;nbsp;how&amp;nbsp;specific&amp;nbsp;the&amp;nbsp;task&amp;nbsp;is,&amp;nbsp;and&amp;nbsp;because&amp;nbsp;I&#039;m&amp;nbsp;a&amp;nbsp;lazy&amp;nbsp;bastard&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;that&amp;nbsp;doesn&#039;t&amp;nbsp;want&amp;nbsp;to&amp;nbsp;code&amp;nbsp;bunch&amp;nbsp;of&amp;nbsp;directory&amp;nbsp;logic.&amp;nbsp;&amp;nbsp;The&amp;nbsp;script&amp;nbsp;first&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;queries&amp;nbsp;the&amp;nbsp;input&amp;nbsp;file,&amp;nbsp;then&amp;nbsp;works&amp;nbsp;on&amp;nbsp;this&amp;nbsp;file&amp;nbsp;recursing&amp;nbsp;the&amp;nbsp;steps&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;for&amp;nbsp;each&amp;nbsp;clip.&amp;nbsp;&amp;nbsp;Each&amp;nbsp;clip&amp;nbsp;requires&amp;nbsp;an&amp;nbsp;output&amp;nbsp;name,&amp;nbsp;a&amp;nbsp;start&amp;nbsp;timecode&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;(formatted&amp;nbsp;hh:mm:ss.nnn)&amp;nbsp;and&amp;nbsp;an&amp;nbsp;ending&amp;nbsp;timecode.&amp;nbsp;&amp;nbsp;This&amp;nbsp;is&amp;nbsp;part&amp;nbsp;of&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;some&amp;nbsp;of&amp;nbsp;the&amp;nbsp;headache,&amp;nbsp;as&amp;nbsp;ffmpeg&amp;nbsp;processes&amp;nbsp;clips&amp;nbsp;with&amp;nbsp;a&amp;nbsp;start&amp;nbsp;time&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;and&amp;nbsp;a&amp;nbsp;duration,&amp;nbsp;meaning&amp;nbsp;you&amp;nbsp;have&amp;nbsp;to&amp;nbsp;do&amp;nbsp;the&amp;nbsp;difference&amp;nbsp;math&amp;nbsp;yourself.&amp;nbsp;&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;I&amp;nbsp;take&amp;nbsp;care&amp;nbsp;of&amp;nbsp;this&amp;nbsp;in&amp;nbsp;there.&amp;nbsp;&amp;nbsp;After&amp;nbsp;producing&amp;nbsp;a&amp;nbsp;clip,&amp;nbsp;the&amp;nbsp;script&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;will&amp;nbsp;ask&amp;nbsp;the&amp;nbsp;user&amp;nbsp;if&amp;nbsp;they&amp;nbsp;want&amp;nbsp;to&amp;nbsp;create&amp;nbsp;another&amp;nbsp;clip&amp;nbsp;from&amp;nbsp;the&amp;nbsp;same&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;source&amp;nbsp;file,&amp;nbsp;at&amp;nbsp;which&amp;nbsp;it&amp;nbsp;recurses&amp;nbsp;through&amp;nbsp;a&amp;nbsp;prompting&amp;nbsp;loop.&amp;nbsp;&amp;nbsp;The&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;script&amp;nbsp;also&amp;nbsp;can&amp;nbsp;be&amp;nbsp;run&amp;nbsp;from&amp;nbsp;the&amp;nbsp;command&amp;nbsp;line...however&amp;nbsp;in&amp;nbsp;CLI&amp;nbsp;mode,&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;the&amp;nbsp;intent&amp;nbsp;is&amp;nbsp;to&amp;nbsp;NOT&amp;nbsp;allow&amp;nbsp;the&amp;nbsp;script&amp;nbsp;to&amp;nbsp;re-prompt&amp;nbsp;for&amp;nbsp;additional&amp;nbsp;cips&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;from&amp;nbsp;the&amp;nbsp;same&amp;nbsp;source&amp;nbsp;video.&lt;br \/&gt;\n#&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;The&amp;nbsp;script&amp;nbsp;can&amp;nbsp;optionally&amp;nbsp;take&amp;nbsp;4&amp;nbsp;command&amp;nbsp;line&amp;nbsp;arguments:&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;1)&amp;nbsp;The&amp;nbsp;filename&amp;nbsp;for&amp;nbsp;the&amp;nbsp;source&amp;nbsp;video,&amp;nbsp;without&amp;nbsp;extension&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;2)&amp;nbsp;The&amp;nbsp;desired&amp;nbsp;resulting&amp;nbsp;clip&amp;nbsp;name,&amp;nbsp;without&amp;nbsp;extension&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;3)&amp;nbsp;The&amp;nbsp;start&amp;nbsp;timecode&amp;nbsp;for&amp;nbsp;the&amp;nbsp;clip,&amp;nbsp;format&amp;nbsp;hh:mm:ss.nnn&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;4)&amp;nbsp;The&amp;nbsp;end&amp;nbsp;timecode&amp;nbsp;for&amp;nbsp;the&amp;nbsp;clip,&amp;nbsp;format&amp;nbsp;hh:mm:ss.nnn&lt;br \/&gt;\n#&lt;br \/&gt;\n#&amp;nbsp;Variables:&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;INPUTFILE&amp;nbsp;-&amp;nbsp;Input&amp;nbsp;video&amp;nbsp;filename,&amp;nbsp;without&amp;nbsp;extension&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;OUTPUTFILE&amp;nbsp;-&amp;nbsp;Clip&amp;nbsp;output&amp;nbsp;filename,&amp;nbsp;without&amp;nbsp;extension&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;STARTTIME&amp;nbsp;-&amp;nbsp;Clip&amp;nbsp;starting&amp;nbsp;timecode,&amp;nbsp;format&amp;nbsp;hh:mm:ss.nnn&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;ENDTIME&amp;nbsp;-&amp;nbsp;Clip&amp;nbsp;ending&amp;nbsp;timecode,&amp;nbsp;format&amp;nbsp;hh:mm:ss.nnn&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;NANODIFF&amp;nbsp;-&amp;nbsp;Difference&amp;nbsp;between&amp;nbsp;start&amp;nbsp;and&amp;nbsp;end&amp;nbsp;timecode,&amp;nbsp;in&amp;nbsp;milliseconds&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;NUMSECS&amp;nbsp;-&amp;nbsp;Timecoe&amp;nbsp;difference&amp;nbsp;in&amp;nbsp;whole&amp;nbsp;seconds&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;NUMNANO&amp;nbsp;-&amp;nbsp;Timecode&amp;nbsp;difference&amp;nbsp;remainder&amp;nbsp;in&amp;nbsp;milliseconds&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;REPLY&amp;nbsp;-&amp;nbsp;Flag&amp;nbsp;for&amp;nbsp;checking&amp;nbsp;if&amp;nbsp;the&amp;nbsp;script&amp;nbsp;should&amp;nbsp;create&amp;nbsp;another&amp;nbsp;clip&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;CLIFLAG&amp;nbsp;-&amp;nbsp;Flag&amp;nbsp;set&amp;nbsp;if&amp;nbsp;command&amp;nbsp;line&amp;nbsp;mode&amp;nbsp;is&amp;nbsp;detected,&amp;nbsp;to&amp;nbsp;prevent&amp;nbsp;prompting&lt;br \/&gt;\n#&lt;br \/&gt;\n&lt;br \/&gt;\n#&amp;nbsp;Prompt&amp;nbsp;the&amp;nbsp;user&amp;nbsp;for&amp;nbsp;all&amp;nbsp;parameters,&amp;nbsp;by&amp;nbsp;asking&amp;nbsp;for&amp;nbsp;the&amp;nbsp;source&amp;nbsp;clip&amp;nbsp;name,&amp;nbsp;then&amp;nbsp;calling&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;the&amp;nbsp;function&amp;nbsp;which&amp;nbsp;prompts&amp;nbsp;for&amp;nbsp;the&amp;nbsp;clip&amp;nbsp;info.&amp;nbsp;&amp;nbsp;This&amp;nbsp;can&amp;nbsp;safely&amp;nbsp;call&amp;nbsp;the&amp;nbsp;clip-info&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;prompting&amp;nbsp;function,&amp;nbsp;as&amp;nbsp;this&amp;nbsp;should&amp;nbsp;only&amp;nbsp;be&amp;nbsp;used&amp;nbsp;once&amp;nbsp;per&amp;nbsp;execution,&amp;nbsp;if&amp;nbsp;at&amp;nbsp;all.&lt;br \/&gt;\nPROMPTFULL()&amp;nbsp;{&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&quot;---What&amp;nbsp;is&amp;nbsp;the&amp;nbsp;source&amp;nbsp;video&amp;nbsp;name?&amp;nbsp;(No&amp;nbsp;Extension)&amp;nbsp;(Inside&amp;nbsp;\/home\/surfrock66\/Videos\/HomeMoviesRaw\/):&quot;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;First&amp;nbsp;point&amp;nbsp;of&amp;nbsp;possible&amp;nbsp;declaration&amp;nbsp;for&amp;nbsp;INPUTFILE&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;read&amp;nbsp;INPUTFILE&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;Execute&amp;nbsp;the&amp;nbsp;PROMPCLIP&amp;nbsp;function&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;PROMPTCLIP&lt;br \/&gt;\n}&lt;br \/&gt;\n&lt;br \/&gt;\n#&amp;nbsp;Prompt&amp;nbsp;the&amp;nbsp;user&amp;nbsp;for&amp;nbsp;the&amp;nbsp;clip&amp;nbsp;name,&amp;nbsp;start&amp;nbsp;time,&amp;nbsp;and&amp;nbsp;end&amp;nbsp;time.&amp;nbsp;&amp;nbsp;&lt;br \/&gt;\nPROMPTCLIP()&amp;nbsp;{&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&quot;---What&amp;nbsp;is&amp;nbsp;the&amp;nbsp;output&amp;nbsp;filename&amp;nbsp;for&amp;nbsp;this&amp;nbsp;clip?&amp;nbsp;(No&amp;nbsp;Extension):&quot;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;First&amp;nbsp;point&amp;nbsp;of&amp;nbsp;possible&amp;nbsp;declaration&amp;nbsp;for&amp;nbsp;OUTPUTFILE&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;read&amp;nbsp;OUTPUTFILE&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&quot;---What&amp;nbsp;is&amp;nbsp;the&amp;nbsp;timecode&amp;nbsp;for&amp;nbsp;the&amp;nbsp;start&amp;nbsp;of&amp;nbsp;this&amp;nbsp;clip?&amp;nbsp;(##:##:##.###):&quot;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;First&amp;nbsp;point&amp;nbsp;of&amp;nbsp;possible&amp;nbsp;declaration&amp;nbsp;for&amp;nbsp;STARTTIME&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;read&amp;nbsp;STARTTIME&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&quot;---What&amp;nbsp;is&amp;nbsp;the&amp;nbsp;timecode&amp;nbsp;for&amp;nbsp;the&amp;nbsp;end&amp;nbsp;of&amp;nbsp;this&amp;nbsp;clip?&amp;nbsp;(##:##:##.###):&quot;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;First&amp;nbsp;point&amp;nbsp;of&amp;nbsp;possible&amp;nbsp;declaration&amp;nbsp;for&amp;nbsp;ENDTIME&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;read&amp;nbsp;ENDTIME&lt;br \/&gt;\n}&lt;br \/&gt;\n&lt;br \/&gt;\n#&amp;nbsp;This&amp;nbsp;function&amp;nbsp;handles&amp;nbsp;the&amp;nbsp;timecode&amp;nbsp;calculations&amp;nbsp;to&amp;nbsp;find&amp;nbsp;the&amp;nbsp;clip&amp;nbsp;duration,&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;then&amp;nbsp;executes&amp;nbsp;the&amp;nbsp;actial&amp;nbsp;ffmpeg&amp;nbsp;command.&lt;br \/&gt;\nPROCESSVID()&amp;nbsp;{&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;Calculate&amp;nbsp;the&amp;nbsp;actuall&amp;nbsp;difference,&amp;nbsp;in&amp;nbsp;milliseconds&amp;nbsp;(but&amp;nbsp;we&#039;ll&amp;nbsp;call&amp;nbsp;them&amp;nbsp;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;nanoseconds,&amp;nbsp;because&amp;nbsp;that&#039;s&amp;nbsp;how&amp;nbsp;the&amp;nbsp;date&amp;nbsp;command&amp;nbsp;works)&amp;nbsp;between&amp;nbsp;the&amp;nbsp;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;start&amp;nbsp;time&amp;nbsp;and&amp;nbsp;end&amp;nbsp;time.&amp;nbsp;&amp;nbsp;This&amp;nbsp;relies&amp;nbsp;heavily&amp;nbsp;on&amp;nbsp;the&amp;nbsp;&quot;date&quot;&amp;nbsp;command.&amp;nbsp;&amp;nbsp;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;It&amp;nbsp;can&amp;nbsp;convert&amp;nbsp;formatted&amp;nbsp;timecodes&amp;nbsp;between&amp;nbsp;different&amp;nbsp;format&amp;nbsp;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;conventions,&amp;nbsp;but&amp;nbsp;to&amp;nbsp;go&amp;nbsp;from&amp;nbsp;something&amp;nbsp;resembling&amp;nbsp;a&amp;nbsp;standard&amp;nbsp;video&amp;nbsp;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;editing&amp;nbsp;timecode&amp;nbsp;to&amp;nbsp;a&amp;nbsp;raw&amp;nbsp;nanosecond&amp;nbsp;count&amp;nbsp;is&amp;nbsp;a&amp;nbsp;PAIN&amp;nbsp;IN&amp;nbsp;THE&amp;nbsp;ASS.&amp;nbsp;&amp;nbsp;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;This&amp;nbsp;strips&amp;nbsp;out&amp;nbsp;the&amp;nbsp;amount&amp;nbsp;of&amp;nbsp;hours&amp;nbsp;in&amp;nbsp;milliseconds,&amp;nbsp;then&amp;nbsp;the&amp;nbsp;number&amp;nbsp;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;of&amp;nbsp;minutes&amp;nbsp;in&amp;nbsp;milliseconds,&amp;nbsp;then&amp;nbsp;the&amp;nbsp;number&amp;nbsp;of&amp;nbsp;seconds&amp;nbsp;in&amp;nbsp;milliseconds,&amp;nbsp;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;then&amp;nbsp;the&amp;nbsp;number&amp;nbsp;of&amp;nbsp;nanoseconds&amp;nbsp;in&amp;nbsp;milliseconds.&amp;nbsp;&amp;nbsp;It&amp;nbsp;then&amp;nbsp;adds&amp;nbsp;them&amp;nbsp;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;together,&amp;nbsp;creates&amp;nbsp;a&amp;nbsp;full&amp;nbsp;millisecond&amp;nbsp;count&amp;nbsp;for&amp;nbsp;the&amp;nbsp;start&amp;nbsp;an&amp;nbsp;end&amp;nbsp;time,&amp;nbsp;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;and&amp;nbsp;then&amp;nbsp;finds&amp;nbsp;the&amp;nbsp;difference,&amp;nbsp;in&amp;nbsp;milliseconds.&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;NANODIFF=$(($(($(($(date&amp;nbsp;-d&amp;nbsp;$ENDTIME&amp;nbsp;+%-H)&amp;nbsp;&lt;em&gt;&amp;nbsp;3600000))&amp;nbsp;+&amp;nbsp;$(($(date&amp;nbsp;-d&amp;nbsp;$ENDTIME&amp;nbsp;+%-M)&amp;nbsp;&lt;\/em&gt;&amp;nbsp;60000))&amp;nbsp;+&amp;nbsp;$(($(date&amp;nbsp;-d&amp;nbsp;$ENDTIME&amp;nbsp;+%-S)&amp;nbsp;&lt;em&gt;&amp;nbsp;1000))&amp;nbsp;+&amp;nbsp;$(($(date&amp;nbsp;-d&amp;nbsp;$ENDTIME&amp;nbsp;+%-N)&amp;nbsp;\/&amp;nbsp;1000000))))&amp;nbsp;-&amp;nbsp;$(($(($(date&amp;nbsp;-d&amp;nbsp;$STARTTIME&amp;nbsp;+%-H)&amp;nbsp;&lt;\/em&gt;&amp;nbsp;3600000))&amp;nbsp;+&amp;nbsp;$(($(date&amp;nbsp;-d&amp;nbsp;$STARTTIME&amp;nbsp;+%-M)&amp;nbsp;&lt;em&gt;&amp;nbsp;60000))&amp;nbsp;+&amp;nbsp;$(($(date&amp;nbsp;-d&amp;nbsp;$STARTTIME&amp;nbsp;+%-S)&amp;nbsp;&lt;\/em&gt;&amp;nbsp;1000))&amp;nbsp;+&amp;nbsp;$(($(date&amp;nbsp;-d&amp;nbsp;$STARTTIME&amp;nbsp;+%-N)&amp;nbsp;\/&amp;nbsp;1000000))))))&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;Convert&amp;nbsp;the&amp;nbsp;resulting&amp;nbsp;difference,&amp;nbsp;in&amp;nbsp;millisecodns,&amp;nbsp;into&amp;nbsp;seconds&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;NUMSECS=$(($NANODIFF&amp;nbsp;\/&amp;nbsp;1000))&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;Convert&amp;nbsp;the&amp;nbsp;reaminder&amp;nbsp;of&amp;nbsp;the&amp;nbsp;resulting&amp;nbsp;difference,&amp;nbsp;in&amp;nbsp;milliseconds,&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;to&amp;nbsp;milliseconds&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;NUMNANO=$(($NANODIFF&amp;nbsp;%&amp;nbsp;1000))&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;Print&amp;nbsp;out&amp;nbsp;the&amp;nbsp;ffmpeg&amp;nbsp;command&amp;nbsp;that&amp;nbsp;is&amp;nbsp;generated,&amp;nbsp;mostly&amp;nbsp;for&amp;nbsp;debugging&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&quot;\\nCommand:&amp;nbsp;ffmpeg&amp;nbsp;-i&amp;nbsp;\\&quot;\/home\/surfrock66\/Videos\/HomeMoviesRaw\/$INPUTFILE.mp4\\&quot;&amp;nbsp;-ss&amp;nbsp;$STARTTIME&amp;nbsp;-t&amp;nbsp;$NUMSECS.$NUMNANO&amp;nbsp;-vcodec&amp;nbsp;libx264&amp;nbsp;-b&amp;nbsp;1500k&amp;nbsp;-s&amp;nbsp;480x480&amp;nbsp;-acodec&amp;nbsp;libfaac&amp;nbsp;-ab&amp;nbsp;192k&amp;nbsp;-ac&amp;nbsp;1&amp;nbsp;-threads&amp;nbsp;8&amp;nbsp;\\&quot;\/home\/surfrock66\/Videos\/HomeMoviesRaw\/$INPUTFILE\/$OUTPUTFILE.mp4\\&quot;\\n&quot;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;Execute&amp;nbsp;the&amp;nbsp;ffmpeg&amp;nbsp;command,&amp;nbsp;this&amp;nbsp;is&amp;nbsp;the&amp;nbsp;big&amp;nbsp;kahuna.&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;ffmpeg&amp;nbsp;-i&amp;nbsp;&quot;\/home\/surfrock66\/Videos\/HomeMoviesRaw\/$INPUTFILE.mp4&quot;&amp;nbsp;-ss&amp;nbsp;$STARTTIME&amp;nbsp;-t&amp;nbsp;$NUMSECS.$NUMNANO&amp;nbsp;-vcodec&amp;nbsp;libx264&amp;nbsp;-b&amp;nbsp;1500k&amp;nbsp;-s&amp;nbsp;480x480&amp;nbsp;-acodec&amp;nbsp;libfaac&amp;nbsp;-ab&amp;nbsp;192k&amp;nbsp;-ac&amp;nbsp;1&amp;nbsp;-threads&amp;nbsp;8&amp;nbsp;&quot;\/home\/surfrock66\/Videos\/HomeMoviesRaw\/$INPUTFILE\/$OUTPUTFILE.mp4&quot;&lt;br \/&gt;\n}&lt;br \/&gt;\n&lt;br \/&gt;\n#&amp;nbsp;Start&amp;nbsp;of&amp;nbsp;the&amp;nbsp;main&amp;nbsp;script.&amp;nbsp;&amp;nbsp;Section&amp;nbsp;1:&amp;nbsp;Input&amp;nbsp;validation&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;Check&amp;nbsp;that&amp;nbsp;there&amp;nbsp;is&amp;nbsp;a&amp;nbsp;first&amp;nbsp;parameter.&amp;nbsp;&amp;nbsp;If&amp;nbsp;not,&amp;nbsp;Prompt&amp;nbsp;the&amp;nbsp;user&amp;nbsp;for&amp;nbsp;the&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;&amp;nbsp;parameters.&amp;nbsp;&amp;nbsp;If&amp;nbsp;there&amp;nbsp;is&amp;nbsp;one,&amp;nbsp;validate&amp;nbsp;the&amp;nbsp;rest&amp;nbsp;of&amp;nbsp;the&amp;nbsp;params,&amp;nbsp;then&amp;nbsp;&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;&amp;nbsp;either&amp;nbsp;prompt&amp;nbsp;the&amp;nbsp;user,&amp;nbsp;or&amp;nbsp;use&amp;nbsp;the&amp;nbsp;passed&amp;nbsp;params.&lt;br \/&gt;\nif&amp;nbsp;[&amp;nbsp;-z&amp;nbsp;&quot;$1&quot;&amp;nbsp;]&lt;br \/&gt;\nthen&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;Call&amp;nbsp;the&amp;nbsp;prompt&amp;nbsp;function,&amp;nbsp;including&amp;nbsp;asking&amp;nbsp;for&amp;nbsp;the&amp;nbsp;source&amp;nbsp;video&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;PROMPTFULL&lt;br \/&gt;\nelse&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;Assuming&amp;nbsp;the&amp;nbsp;first&amp;nbsp;parameter&amp;nbsp;exists,&amp;nbsp;check&amp;nbsp;for&amp;nbsp;parameters&amp;nbsp;2,3,&amp;nbsp;and&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;4.&amp;nbsp;&amp;nbsp;I&#039;m&amp;nbsp;not&amp;nbsp;validating&amp;nbsp;these&amp;nbsp;strings,&amp;nbsp;mostly&amp;nbsp;because&amp;nbsp;ffmpeg&amp;nbsp;will&amp;nbsp;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;flip&amp;nbsp;out&amp;nbsp;if&amp;nbsp;there&#039;s&amp;nbsp;something&amp;nbsp;wrong&amp;nbsp;with&amp;nbsp;them...as&amp;nbsp;you&amp;nbsp;know,&amp;nbsp;it&#039;s&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;quite&amp;nbsp;verbose.&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;if&amp;nbsp;[&amp;nbsp;-z&amp;nbsp;&quot;$2&quot;&amp;nbsp;-o&amp;nbsp;-z&amp;nbsp;&quot;$3&quot;&amp;nbsp;-o&amp;nbsp;-z&amp;nbsp;&quot;$4&quot;&amp;nbsp;]&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;then&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;If&amp;nbsp;any&amp;nbsp;parameters&amp;nbsp;are&amp;nbsp;invalid,&amp;nbsp;prompt&amp;nbsp;for&amp;nbsp;them&amp;nbsp;all.&amp;nbsp;Even&amp;nbsp;if&amp;nbsp;param&amp;nbsp;1&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;is&amp;nbsp;successfully&amp;nbsp;detected,&amp;nbsp;re-ask&amp;nbsp;for&amp;nbsp;it.&amp;nbsp;&amp;nbsp;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&quot;--Parameters&amp;nbsp;are&amp;nbsp;incomplete,&amp;nbsp;switching&amp;nbsp;to&amp;nbsp;prompt&amp;nbsp;mode.&quot;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PROMPTFULL&amp;nbsp;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;else&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Pass&amp;nbsp;all&amp;nbsp;the&amp;nbsp;command&amp;nbsp;line&amp;nbsp;parameters&amp;nbsp;to&amp;nbsp;the&amp;nbsp;variables&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INPUTFILE=&quot;$1&quot;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OUTPUTFILE=&quot;$2&quot;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STARTTIME=&quot;$3&quot;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ENDTIME=&quot;$4&quot;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Change&amp;nbsp;the&amp;nbsp;flag&amp;nbsp;to&amp;nbsp;indicate&amp;nbsp;later&amp;nbsp;that&amp;nbsp;this&amp;nbsp;initiated&amp;nbsp;by&amp;nbsp;CLI&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CLIFLAG=&quot;yes&quot;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;fi&lt;br \/&gt;\nfi&lt;br \/&gt;\n&lt;br \/&gt;\n#&amp;nbsp;Create&amp;nbsp;the&amp;nbsp;default&amp;nbsp;output&amp;nbsp;directory,&amp;nbsp;if&amp;nbsp;it&#039;s&amp;nbsp;not&amp;nbsp;already&amp;nbsp;created&lt;br \/&gt;\nif&amp;nbsp;[&amp;nbsp;!&amp;nbsp;-d&amp;nbsp;\/home\/surfrock66\/Videos\/HomeMoviesRaw\/$INPUTFILE&amp;nbsp;];&amp;nbsp;then&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;mkdir&amp;nbsp;\/home\/surfrock66\/Videos\/HomeMoviesRaw\/$INPUTFILE&lt;br \/&gt;\nfi&lt;br \/&gt;\n&lt;br \/&gt;\n#&amp;nbsp;Now...initiate&amp;nbsp;the&amp;nbsp;final&amp;nbsp;video&amp;nbsp;processing&lt;br \/&gt;\n#&amp;nbsp;&amp;nbsp;Declare&amp;nbsp;and&amp;nbsp;initiate&amp;nbsp;the&amp;nbsp;REPLY&amp;nbsp;flag...can&amp;nbsp;be&amp;nbsp;set&amp;nbsp;to&amp;nbsp;anything&amp;nbsp;byt&amp;nbsp;n\/N&lt;br \/&gt;\nREPLY=&quot;y&quot;&lt;br \/&gt;\n#&amp;nbsp;As&amp;nbsp;long&amp;nbsp;as&amp;nbsp;the&amp;nbsp;REPLY&amp;nbsp;flag&amp;nbsp;isn&#039;t&amp;nbsp;n&amp;nbsp;or&amp;nbsp;N,&amp;nbsp;repeat&amp;nbsp;the&amp;nbsp;loop&lt;br \/&gt;\nwhile&amp;nbsp;[&amp;nbsp;&quot;$REPLY&quot;&amp;nbsp;!=&amp;nbsp;&quot;n&quot;&amp;nbsp;]&amp;nbsp;&amp;&amp;&amp;nbsp;[&amp;nbsp;&quot;$REPLY&quot;&amp;nbsp;!=&amp;nbsp;&quot;N&quot;&amp;nbsp;]&lt;br \/&gt;\ndo&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;Call&amp;nbsp;the&amp;nbsp;function&amp;nbsp;PROCESSVID&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;PROCESSVID&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;Check&amp;nbsp;to&amp;nbsp;see&amp;nbsp;if&amp;nbsp;the&amp;nbsp;script&amp;nbsp;was&amp;nbsp;run&amp;nbsp;with&amp;nbsp;command&amp;nbsp;line&amp;nbsp;parameters,&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;If&amp;nbsp;not,&amp;nbsp;issue&amp;nbsp;a&amp;nbsp;bunch&amp;nbsp;of&amp;nbsp;logic&amp;nbsp;to&amp;nbsp;see&amp;nbsp;if&amp;nbsp;we&amp;nbsp;want&amp;nbsp;to&amp;nbsp;re-run&amp;nbsp;the&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;code&amp;nbsp;for&amp;nbsp;new&amp;nbsp;clips&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;if&amp;nbsp;[&amp;nbsp;-z&amp;nbsp;&quot;$CLIFLAG&quot;&amp;nbsp;]&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;then&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Now&amp;nbsp;that&amp;nbsp;we&amp;nbsp;know&amp;nbsp;the&amp;nbsp;script&amp;nbsp;was&amp;nbsp;run&amp;nbsp;in&amp;nbsp;prompt&amp;nbsp;mode,&amp;nbsp;ask&amp;nbsp;the&amp;nbsp;user&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;if&amp;nbsp;they&amp;nbsp;want&amp;nbsp;to&amp;nbsp;make&amp;nbsp;another&amp;nbsp;clip,&amp;nbsp;repeating&amp;nbsp;this&amp;nbsp;loop&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&quot;---Would&amp;nbsp;you&amp;nbsp;like&amp;nbsp;to&amp;nbsp;create&amp;nbsp;another&amp;nbsp;clip&amp;nbsp;from&amp;nbsp;this&amp;nbsp;input&amp;nbsp;video?&amp;nbsp;{Y\/n}&quot;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;read&amp;nbsp;REPLY&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;[&amp;nbsp;&quot;$REPLY&quot;&amp;nbsp;!=&amp;nbsp;&quot;n&quot;&amp;nbsp;]&amp;nbsp;&amp;&amp;&amp;nbsp;[&amp;nbsp;&quot;$REPLY&quot;&amp;nbsp;!=&amp;nbsp;&quot;N&quot;&amp;nbsp;]&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;then&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PROMPTCLIP&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fi&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;If&amp;nbsp;it&amp;nbsp;was&amp;nbsp;run&amp;nbsp;by&amp;nbsp;command&amp;nbsp;line,&amp;nbsp;essentially&amp;nbsp;abort&amp;nbsp;the&amp;nbsp;loop,&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;#&amp;nbsp;&amp;nbsp;and&amp;nbsp;the&amp;nbsp;script.&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;else&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;REPLY=&quot;n&quot;&lt;br \/&gt;\n&amp;nbsp;&amp;nbsp;fi&lt;br \/&gt;\ndone&lt;br \/&gt;\n<\/code><\/p>","protected":false},"excerpt":{"rendered":"<p>#!\/bin\/bash<br \/> #&nbsp;<br \/> #&nbsp;Title:&nbsp;HomeMoviesClipper.sh<br \/> #&nbsp;Description:&nbsp;Use&nbsp;ffmpeg&nbsp;to&nbsp;split&nbsp;raw&nbsp;home&nbsp;movie&nbsp;captures&nbsp;into&nbsp;clips<br \/> #&nbsp;Original&nbsp;Author:&nbsp;Joseph&nbsp;Gullo&nbsp;(surfrock66)&nbsp;(surfrock66@surfrock66.com)<br \/> #<br \/> #&nbsp;This&nbsp;script&nbsp;works&nbsp;with&nbsp;a&nbsp;very&nbsp;specific&nbsp;set&nbsp;of&nbsp;constraints&nbsp;and&nbsp;formats&nbsp;to&nbsp;<br \/> #&nbsp;&nbsp;take&nbsp;raw&nbsp;video&nbsp;captures&nbsp;and&nbsp;split&nbsp;them&nbsp;into&nbsp;clips&nbsp;of&nbsp;events.&nbsp;&nbsp;Each&nbsp;of&nbsp;<br \/> #&nbsp;&nbsp;these&nbsp;movies&nbsp;was&nbsp;captured,&nbsp;using&nbsp;a&nbsp;Dazzle&nbsp;USB&nbsp;video&nbsp;capture&nbsp;device,&nbsp;<br \/> #&nbsp;&nbsp;into&nbsp;h264&nbsp;video&nbsp;and&nbsp;mp3&nbsp;audio,&nbsp;using&nbsp;VLC.&nbsp;&nbsp;These&nbsp;original&nbsp;tapes&nbsp;were&nbsp;<br \/> #&nbsp;&nbsp;typically&nbsp;close&nbsp;to&nbsp;2&nbsp;hours&nbsp;long,&nbsp;however&nbsp;capture&nbsp;was&nbsp;often&nbsp;left&nbsp;to&nbsp;run,&nbsp;<br \/> #&nbsp;&nbsp;creating&nbsp;videos&nbsp;that&nbsp;were&nbsp;8+&nbsp;hours&nbsp;long.&nbsp;&nbsp;The&nbsp;capture&nbsp;device&nbsp;produced&nbsp;<br \/> #&nbsp;&nbsp;video&nbsp;that&nbsp;was&nbsp;480&#215;480&nbsp;and&nbsp;audio&nbsp;that&nbsp;only&nbsp;contains&nbsp;1&nbsp;channel&nbsp;(recorded&nbsp;<br \/> #&nbsp;&nbsp;through&nbsp;stereo),&nbsp;and&nbsp;the&nbsp;output&nbsp;video&nbsp;will&nbsp;retain&nbsp;this.&nbsp;&nbsp;The&nbsp;desired&nbsp;<br \/> #&nbsp;&nbsp;format&nbsp;is&nbsp;high-bitrate&nbsp;h264&nbsp;and&nbsp;aac&nbsp;audio,&nbsp;encapsulated&nbsp;in&nbsp;.mp4&nbsp;files.&nbsp;<br \/> #&nbsp;&nbsp;This&nbsp;script&nbsp;also&nbsp;works&nbsp;within&nbsp;a&nbsp;predictable&nbsp;directory&nbsp;environment&nbsp;<br \/> #&nbsp;&nbsp;because&nbsp;of&nbsp;how&nbsp;specific&nbsp;the&nbsp;task&nbsp;is,&nbsp;and&nbsp;because&nbsp;I&#039;m&nbsp;a&nbsp;lazy&nbsp;bastard&nbsp;<br \/> #&nbsp;&nbsp;that&nbsp;doesn&#039;t&nbsp;want&nbsp;to&nbsp;code&nbsp;bunch&nbsp;of&nbsp;directory&nbsp;logic.&nbsp;&nbsp;The&nbsp;script&nbsp;first&nbsp;<br \/> #&nbsp;&nbsp;queries&nbsp;the&nbsp;input&nbsp;file,&nbsp;then&nbsp;works&nbsp;on&nbsp;this&nbsp;file&nbsp;recursing&nbsp;the&nbsp;steps&nbsp;<br \/> #&nbsp;&nbsp;for&nbsp;each&nbsp;clip.&nbsp;&nbsp;Each&nbsp;clip&nbsp;requires&nbsp;an&nbsp;output&nbsp;name,&nbsp;a&nbsp;start&nbsp;timecode&nbsp;<br \/> #&nbsp;&nbsp;(formatted&nbsp;hh:mm:ss.nnn)&nbsp;and&nbsp;an&nbsp;ending&nbsp;timecode.&nbsp;&nbsp;This&nbsp;is&nbsp;part&nbsp;of&nbsp;<br \/> #&nbsp;&nbsp;some&nbsp;of&nbsp;the&nbsp;headache,&nbsp;as&nbsp;ffmpeg&nbsp;processes&nbsp;clips&nbsp;with&nbsp;a&nbsp;start&nbsp;time&nbsp;<br \/> #&nbsp;&nbsp;and&nbsp;a&nbsp;duration,&nbsp;meaning&nbsp;you&nbsp;have&nbsp;to&nbsp;do&nbsp;the&nbsp;difference&nbsp;math&nbsp;yourself.&nbsp;&nbsp;<br \/> #&nbsp;&nbsp;I&nbsp;take&nbsp;care&nbsp;of&nbsp;this&nbsp;in&nbsp;there.&nbsp;&nbsp;After&nbsp;producing&nbsp;a&nbsp;clip,&nbsp;the&nbsp;script&nbsp;<br \/> #&nbsp;&nbsp;will&nbsp;ask&nbsp;the&nbsp;user&nbsp;if&nbsp;they&nbsp;want&nbsp;to&nbsp;create&nbsp;another&nbsp;clip&nbsp;from&nbsp;the&nbsp;same&nbsp;<br \/> #&nbsp;&nbsp;source&nbsp;file,&nbsp;at&nbsp;which&nbsp;it&nbsp;recurses&nbsp;through&nbsp;a&nbsp;prompting&nbsp;loop.&nbsp;&nbsp;The&nbsp;<br \/> #&nbsp;&nbsp;script&nbsp;also&nbsp;can&nbsp;be&nbsp;run&nbsp;from&nbsp;the&nbsp;command&nbsp;line&#8230;however&nbsp;in&nbsp;CLI&nbsp;mode,&nbsp;<br \/> #&nbsp;&nbsp;the&nbsp;intent&nbsp;is&nbsp;to&nbsp;NOT&nbsp;allow&nbsp;the&nbsp;script&nbsp;to&nbsp;re-prompt&nbsp;for&nbsp;additional&nbsp;cips&nbsp;&lt;br [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,3],"tags":[],"class_list":["post-1406","post","type-post","status-publish","format-standard","hentry","category-geek","category-projects"],"_links":{"self":[{"href":"https:\/\/surfrock66.com\/index.php?rest_route=\/wp\/v2\/posts\/1406","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/surfrock66.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/surfrock66.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/surfrock66.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/surfrock66.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1406"}],"version-history":[{"count":6,"href":"https:\/\/surfrock66.com\/index.php?rest_route=\/wp\/v2\/posts\/1406\/revisions"}],"predecessor-version":[{"id":1411,"href":"https:\/\/surfrock66.com\/index.php?rest_route=\/wp\/v2\/posts\/1406\/revisions\/1411"}],"wp:attachment":[{"href":"https:\/\/surfrock66.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1406"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/surfrock66.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1406"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/surfrock66.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1406"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}