[Ardour-Users] "Extract LTC from audio and align video" menu option missing from "Transcode/Import Video file" popup
robertlazarski
robertlazarski at gmail.com
Tue Apr 24 12:30:30 PDT 2018
On Sat, Apr 21, 2018 at 8:54 PM, Chris Caudle <chris at chriscaudle.org> wrote:
> On Fri, April 20, 2018 11:49 am, robertlazarski wrote:
> > The phone problem with Ardour was indeed because it was a variable rate
> > issue. I was able to fix it with this command. And then Ardour was fine
> > with it.
>
> That's good to know. Did we coincidentally find that near the same time,
> or did my noticing the original was variable frame rate prompt some
> experiments to check it out?
>
I would have never figured out the variable framerate problem without your
help - thanks again for giving me a clue. Once the q8 worked then the
phone obviously was creating videos that had some type of problem in Ardour
and I dug more into it.
I have another problem now with this phone, I can't get the phone video wav
file sample position per LTC frame to match the q8 sample position. This is
what I think is causing a 2 second delay sync problem in a 3 minute or so
in a test video that has parts from both the q8 and the phone.
I can't seem to fix this, each LTC frame has a different size in the phone
wav file compared to the q8.wav file. Both of the original videos show
"CABAC / 1 Ref Frames" . However the phone video audio was recorded as AAC
while the q8 video audio was recorded as PCM so maybe that is the issue.
# phone video in mp4 format and AAC audio, cannot fix this with ffmpeg by
any conversion I tried
00000000 00:26:55:01 | 3118 4715 # (4715 - 3118) = 1597
# q8 mov video and PCM audio
00000000 00:26:55:01 | 3123 4724 # (4724 - 3132) = 1601
Any idea how to fix this?
> > The Tentacle Sync LTC generator also works fine and I'm really happy
> with it.
>
> Seems like a cool little device, I was not previously familiar with it.
>
I have a second TS and Q8 arriving in a few days, I am happy enough with
the combo to sort of standardize on it. The phone videos are a PITA as I
am finding out, to the extent I don't want to mess around with multiple
phone videos.
> > To be clear my priority is good audio and then whatever video
> > that comes with it is ok for me.
>
> That is what the 8 channel Zoom audio recorder is for, right? I assumed
> you were using a traditional arrangement where you only needed the camera
> to record timecode, all the main audio would go to the multichannel
> recorder, so camera audio quality wasn't really a consideration.
>
I just prefer balanced connections whenever possible so I use XLR / TRS
where I can. Most of what I do is +4db so I just think like that.
The main advantage of the Q8 though is it can do "audio-only" recording and
I forsee the camera becoming far surpassed in a couple years - but still
having use for the unit as a reasonably high quality audio capture device.
Cheap video is changing fast while ADC and preamps not so much imho.
The F8 can't overdub - IOW record one channel at a time - and for video
that makes sense. I plan to load what I record as audio-only on the Q8 and
then run a sampler for some live session things to make up somewhat for a
lack of overdubs.
>
> > Best I can tell the typical workflow using Ardour for
> > multiple cameras, has a video software editing step in between recording
> > and Ardour.
>
> Right, assumes a traditional video based work flow where the video editing
> happens first, then the audio has to match up to the edited video.
>
> > However I googled and I couldn't find a Linux based UI that can read LTC
> -
> > besides XJadeo but for multiple videos that's not the right tool?
>
> Open source video editing on Linux is still pretty weak. Cinelerra is the
> closest to something designed for a professional or semi-pro work flow.
> Cinelerra is confusing because there are three separate versions
> maintained simultaneously, might take some time to figure out which fork
> best fits what you want.
> Lightworks might be a good bet, it is no cost for the basic version, not
> Free Software, no source provided, no modifications, have to buy up to
> more features if you need them. But it is high quality commercially
> supported video editing software for linux.
> Blender has a video editor, it is most known as animation software but
> supposedly the editor is pretty decent as well.
>
I loaded my q8.mov file with LTC into Cinelerra but it doesn't seem to be
able to read LTC. I looked at the docs and couldn't find anything related
to LTC. Entirely possible I am missing something.
Any other open source options?
I am probably going to look at Lightworks, it requires a registration so I
haven't decided yet.
> --
> Chris Caudle
>
>
>
See below for the script I am running. It divides the videos into (roughly)
10 second parts. It seemingly merges the LTC fine all the way thru and I
believe I just need to figure out the LTC frame size issue on the phone. Or
just use the q8 for all the cameras.
This script was a way for me to get into my shell comfort zone while
learning more about ffmpeg and ltcdump. Some ffmpeg flags may be wrong or
unneeded. I am a newbie and probably doing many things wrong. The script
was meant to be readable and creates a lot of debug info.
This may be the last script that tries to make the phone play nice with the
q8.
#!/bin/bash
# This script generates a single video from parts of videos from 2 cameras
by using ltc.
#
# Its purpose is to parse the ltc and split the videos from each camera
into
# roughly 10 second segments.
#
# After this script completes, the final step is to use a DAW to sync
# the audio from a Zoom F8 BWF containing timecode to the video created
# by this script, which still contains the LTC from each camera.
# The Ardour DAW was used in this project to sync the
# audio and final video generated by this script.
#
# http://manual.ardour.org/video-timeline/operations/
#
# This use case has one Moto X4 phone camera, one Zoom Q8 camera,
# and one Zoom F8 audio recorder to generate timecode and record
# 8 tracks onto a BWF file with timecode metadata. LTC is recorded
# onto ch1 of each camera, ch2 contains a scratch audio track from the F8
outputs.
#
# In this case I used the BNC out of the F8 into the phone camera ch1.
# I used a Tentacle Sync E that was "jammed" from the F8, to supply
# ltc into ch1 of the Zoom Q8.
#
# See below for the script that worked for me ymmv.
# Also, take extreme caution when playing any file with
# ltc as its an audio signal that can be very loud and
# even at lower levels it is unpleasant to listen to.
#
# usage:
# /home/myuser/input> ls
# motox_in_file.mp4 output parseLTC.sh q8.mov
# /home/myuser/input> cd output/
# /home/iksrazal/input/output> sh ../parseLTC.sh
# clear any text files from previous processing
rm -f *.txt
rm -f *all*
rm -f *out*
# 1) Most (all?) phone videos use a variable frame rate, convert it to a
constant frame rate
# strangely this command was creating CABAC / 3 Ref Frames without -refs 1
ffmpeg -y -v error -nostdin -i ../motox_in_file.mp4 -r 29.97 -crf 0 -c:a
pcm_s16le -c:v libx264 -refs 1 -x264opts b-pyramid=0 -crf 0 -s 1280x720
fixedmoto.mov
# trim files so they both start exactly at the same timecode of 00:26:55:00
ffmpeg -y -v error -ss 00:00:02.820 -t 00:02:15.400 -i fixedmoto.mov -c
copy mt.mov
ffmpeg -y -v error -ss 00:00:01.320 -t 00:02:15.250 -i ../q8.mov -c copy
q8t.mov
# debug
ffmpeg -y -v error -i ../motox_in_file.mp4 -vn -c:a pcm_s16le -ar 48000 -ac
2 motox_in_file.wav
ffmpeg -y -v error -i fixedmoto.mov -vn -c:a pcm_s16le -ar 48000 -ac 2
fixedmoto.wav
ffmpeg -y -v error -y -i mt.mov -vn -c:a pcm_s16le -ar 48000 -ac 2 mt.wav
ffmpeg -y -v error -i q8t.mov -vn -c:a pcm_s16le -ar 48000 -ac 2 q8t.wav
# 2) split file by key frames in a .07 second duration, need a couple
entries that
# ltcdump can find in each file - ideally just a single entry.
# Convert to same resolution as the q8 1280x720
# DCT-based audio codecs like MP3, AAC rely on neighbouring audio frames
for decoding.
# PCM is self-contained for decoding, so doesn't suffer from this.
# So transcode phone video to mov with pcm.
# Note that -r is placed before -i instead of after -i,
# it is to indicate that the video source is of the frame rate of 29.97
FPS.
# -crf "0" is to indicate x264 to encode the video in “lossless mode”.
# -refs 1 -x264opts b-pyramid=0 is to force the size of the DPB (Decoded
Picture Buffer)
ffmpeg -v error -fflags +genpts -r 29.97 -i mt.mov -c:a pcm_s16le -c:v
libx264 -refs 1 -x264opts b-pyramid=0 -crf 0 -s 1280x720 -segment_time 0.07
-segment_list phone.ffcat -sc_threshold 0 -force_key_frames
"expr:gte(t,n_forced*0.07)" -f segment -reset_timestamps 1 phone_out%03d.mov
# do the same thing for files from the Q8,
ffmpeg -v error -fflags +genpts -r 29.97 -i q8t.mov -c:a pcm_s16le -c:v
libx264 -refs 1 -x264opts b-pyramid=0 -crf 0 -segment_time 0.07
-segment_list q8.ffcat -sc_threshold 0 -force_key_frames
"expr:gte(t,n_forced*0.07)" -f segment -reset_timestamps 1 q8_out%03d.mov
# save the ffcat output to run again if need be while debugging
cp q8.ffcat sav_q8.ffcat
cp phone.ffcat sav_phone.ffcat
# 3)
# some errors I found while playing option bingo with ffmpeg
validate() {
fileToProcess=''
fileToProcess=$1
epoch_secs_ltc_to_process=0
ltc_to_process_formatted=''
isLTCDumpOutputValid=0
found_stop_time=0
# test for shell error
printf "\nExecuting: ltcdump -f 29.97 "$fileToProcess" "
# adding frame rate removes this DISCONTINUITY
# 00000000 00:26:53:24 | 7224 8824
#DISCONTINUITY
ltcdump -f 29.97 "${fileToProcess}" > /dev/null 2>&1
if [ $? -ne 0 ] ; then
printf "\nError processing file %s\n" "${fileToProcess}"
printf "\nshell returned non zero value on validity check"
return
fi
printf "\nExecuting: ltcdump -f 29.97 "${fileToProcess}" 2>/dev/null |
grep -v '#' | grep ':' | wc -w "
hasLTC=0
hasLTC=`ltcdump -f 29.97 "${fileToProcess}" 2>/dev/null | grep -v '#' |
grep ':' | wc -w`
if [[ $hasLTC -eq 0 ]]; then
printf "\nError processing file %s\n" "${fileToProcess}"
printf "\ncannot parse timecode\n"
return
fi
rm -f ltc.txt
# find timecode in format 'HH:MM:SS' with ms trimmed, reject negative
values
# remove occasional '.' in the form 00:00:00.0 instead of 00:00:00:0
# remove negative values
# disallow 0000000f 00:12:25:45
printf "\nExecuting: ltcdump -fps 29.97 "${fileToProcess}" 2>/dev/null
| grep -v '#' | grep 00000000 | grep -v '\.' | grep -v '-' > ltc.txt"
ltcdump -f 29.97 "${fileToProcess}" 2>/dev/null | grep -v '#' | grep
00000000 | grep -v '\.' | grep -v '-' > ltc.txt
lastTimecodeInSegment=0
lastTimecodeInSegment=`tail -n 1 ltc.txt | awk '{ print $2 }' | sed
's/\(.*\):/\1./' `
# can sometimes receive unparsable dates
if [[ ${#lastTimecodeInSegment} -ne 11 ]]; then
lastTimecodeInSegment=0
printf "\nError processing file %s\n" "${fileToProcess}"
printf "\ntimecode number of chars is not correct: "
printf " %s" "${#lastTimecodeInSegment}"
return
fi
# can receive invalid time such as: 00000680 00:13:61:10 |
22 1609
if ! date -d "$lastTimecodeInSegment" >/dev/null 2>&1; then
printf "\nError processing file %s\n" "${fileToProcess}"
printf "\ninvalid date format:" printf " %s"
"$lastTimecodeInSegment"
return
fi
epoch_secs_ltc_to_process=$(date +%s --date="$timecode_date
${lastTimecodeInSegment}")
ltc_to_process_formatted="$timecode_date ${lastTimecodeInSegment}"
printf "\nltc_to_process_formatted: $ltc_to_process_formatted"
if [[ $epoch_secs_ltc_to_process -ne 0 && $epoch_secs_stop_time -ne 0
&& $epoch_secs_ltc_to_process -ge $epoch_secs_stop_time ]]; then
found_stop_time=1
printf "\nskipping file %s\n" "${fileToProcess}"
printf "\ntimecode found:"
printf " %s" "${ltc_to_process_formatted}"
printf "\nis after or equal to stop time: "
printf " %s" "${epoch_secs_stop_time_formatted}"
return
fi
printf "\nfileToProcess seems valid:"
isLTCDumpOutputValid=1
}
# define timecode start time, just add date
timecode_date=2018-04-22
# skip segments before this timecode
epoch_secs_start_time=$(date +%s --date="$timecode_date 00:26:52")
start_time_formatted="$timecode_date 00:26:52.06"
# define timecode stop time
epoch_secs_stop_time=$(date +%s --date="$timecode_date 00:31:40")
stop_timecode=`date +%H:%M:%S:%N --date="Jan 1, 1970 00:00:00 +0000
$epoch_secs_stop_time seconds" | cut -b1-11 | sed 's/\(.*\):/\1./' `
stop_time_formatted="$timecode_date ${stop_timecode}"
timeDivisionInSeconds=20
let epoch_secs_timecode_to_find=$((epoch_secs_start_time +
timeDivisionInSeconds))
find_timecode=`date +%H:%M:%S:%N --date="Jan 1, 1970 00:00:00 +0000
$epoch_secs_timecode_to_find seconds" | cut -b1-11 | sed 's/\(.*\):/\1./'
`
find_timecode_formatted="$timecode_date ${find_timecode}"
let
epoch_secs_next_timecode_to_find=$epoch_secs_timecode_to_find+$timeDivisionInSeconds
next_timecode_to_find=`date +%H:%M:%S:%N --date="Jan 1, 1970 00:00:00 +0000
$epoch_secs_next_timecode_to_find seconds" | cut -b1-11 | sed
's/\(.*\):/\1./' `
next_timecode_to_find_formatted="$timecode_date ${next_timecode_to_find}"
phoneHasLTCStartTime=0
hasRejectBeforeTime=0
phoneTimeCodeInProgress=0
savePhoneCurrentTimeCodeInProgressAlreadyProcessed=0
rejectBeforeTime_formatted=''
savePhoneCurrentTimeCodeInProgress_to_find_formatted=''
while read i; do
# skip auto generated version line
if [[ $i =~ .*ffconcat.* ]]; then
continue
fi
phoneVideoFile=`echo $i | cut -d " " -f2-`;
if [[ ! -f "${phoneVideoFile}.wav" ]]; then
# convert from mp4 to wav, so ltcdump can find the timecode
ffmpeg -v error -nostdin -i $phoneVideoFile -vn -acodec pcm_s16le
-ar 48000 -ac 2 "${phoneVideoFile}.wav"
fi
validate "${phoneVideoFile}.wav"
if [[ $found_stop_time -eq 1 ]]; then
printf "\nphone video is after stop time, executing break\n"
printf "%s\n" "${phoneVideoFile}"
break
fi
if [[ $phoneHasLTCStartTime -eq 0 && $isLTCDumpOutputValid -eq 0 ]];
then
printf "\non phoneHasLTCStartTime=0 and isLTCDumpOutputValid=0 ..
phone video is the default, occasional bad timecode values are ok"
printf "\nadding video to file list to send to all.mp4: "
printf "file %s\n" "${phoneVideoFile}"
printf "file %s\n" "${phoneVideoFile}" >> all.txt
printf "%s\n" "${phoneVideoFile}.wav" >> debug.txt
continue
fi
if [[ $phoneHasLTCStartTime -eq 0 && $isLTCDumpOutputValid -eq 1 ]];
then
dateDiff=0
dateDiff=`date -d "$ltc_to_process_formatted $(date -d
"$start_time_formatted" +%s.%N) seconds ago" +%s.%N`
if awk 'BEGIN{exit ARGV[1]>ARGV[2]}' "0" "$dateDiff"
then
phoneHasLTCStartTime=1
printf "\non dateDiff $dateDiff , ltc_to_process_formatted
$ltc_to_process_formatted is later than or equal to start_time_formatted
$start_time_formatted"
printf "\nproceeding on file %s\n" "${phoneVideoFile}"
else
printf "\non dateDiff $dateDiff , ltc_to_process_formatted
$ltc_to_process_formatted is before start_time_formatted
$start_time_formatted"
printf "\nskipping file %s\n" "${phoneVideoFile}"
continue
fi
fi
if [[ $isLTCDumpOutputValid -eq 0 && $phoneTimeCodeInProgress -eq 1 ]];
then
printf "\nphone video is the default, occasional bad timecode
values are ok"
printf "\nadding video to file list to send to all.mp4: "
printf "file %s\n" "${phoneVideoFile}"
printf "file %s\n" "${phoneVideoFile}" >> all.txt
printf "%s\n" "${phoneVideoFile}.wav" >> debug.txt
continue
fi
if [[ $isLTCDumpOutputValid -eq 0 && $phoneTimeCodeInProgress -eq 0 ]];
then
printf "\nskipping phone video file , ltc is invalid and
phoneTimeCodeInProgress is false: "
printf "file %s\n" "${phoneVideoFile}"
continue
fi
if [[ $hasRejectBeforeTime -eq 1 ]]; then
dateDiff=0
dateDiff=`date -d "$ltc_to_process_formatted $(date -d
"$rejectBeforeTime_formatted" +%s.%N) seconds ago" +%s.%N`
if awk 'BEGIN{exit ARGV[1]>ARGV[2]}' "$dateDiff" "0"
then
printf "\nexecuting continue on file "${phoneVideoFile}" ,
dateDiff $dateDiff , ltc_to_process_formatted $ltc_to_process_formatted is
before or equal to rejectBeforeTime_formatted $rejectBeforeTime_formatted
\n"
continue
else
printf "\nproceeding on file "${phoneVideoFile}" , dateDiff
$dateDiff , ltc_to_process_formatted $ltc_to_process_formatted is after
$rejectBeforeTime_formatted \n"
fi
fi
dateDiff=0
dateDiff=`date -d "$ltc_to_process_formatted $(date -d
"$find_timecode_formatted" +%s.%N) seconds ago" +%s.%N`
if awk 'BEGIN{exit ARGV[1]>ARGV[2]}' "0" "$dateDiff"
then
printf "\non dateDiff $dateDiff , ltc_to_process_formatted
$ltc_to_process_formatted is greater than or equal to
find_timecode_formatted $find_timecode_formatted \n"
else
phoneTimeCodeInProgress=1
printf "\non dateDiff $dateDiff , ltc_to_process_formatted
$ltc_to_process_formatted is less than find_timecode_formatted
$find_timecode_formatted \n"
printf "\nadding video to file list to send to all.mp4: "
printf "file %s\n" "${phoneVideoFile}"
printf "file %s\n" "${phoneVideoFile}" >> all.txt
printf "%s\n" "${phoneVideoFile}.wav" >> debug.txt
continue
fi
printf "\nfound find_timecode: "
printf " %s" "${find_timecode}"
printf "\nin file: "
printf " %s" "${phoneVideoFile}.wav"
printf "\nwill now process the q8 files looking for timecode greater
than or equal to: "
printf " %s" "${find_timecode_formatted}"
printf "\nand timecode less than or equal to: "
printf " %s" "${next_timecode_to_find_formatted}"
phoneTimeCodeInProgress=0
savePhoneCurrentTimeCodeInProgress_to_find_formatted=$ltc_to_process_formatted
savePhoneCurrentTimeCodeInProgressAlreadyProcessed=0
saveQ8CurrentTimeCodeInProgressAlreadyProcessed=0
while read f; do
# skip auto generated version line
if [[ $f =~ .*ffconcat.* ]]; then
continue
fi
q8VideoFile=`echo $f | cut -d " " -f2-`;
printf "%s\n" "${q8VideoFile}" >> q8_processed.txt
# convert Q8 video segments to wav,
# so that ltcdump can find the timecode
if [[ ! -f "${q8VideoFile}.wav" ]]; then
ffmpeg -v error -nostdin -i $q8VideoFile -vn -c:a pcm_s16le -ar
48000 -ac 2 "${q8VideoFile}.wav"
fi
validate "${q8VideoFile}.wav"
if [[ $found_stop_time -eq 1 ]]; then
printf "\nq8 video is after stop time, executing break\n"
break
fi
if [[ $savePhoneCurrentTimeCodeInProgressAlreadyProcessed -eq 0 &&
$q8TimeCodeInProgress -eq 0 && $isLTCDumpOutputValid -eq 1 ]]; then
savePhoneCurrentTimeCodeInProgressAlreadyProcessed=1
dateDiff=0
dateDiff=`date -d
"$savePhoneCurrentTimeCodeInProgress_to_find_formatted $(date -d
"$ltc_to_process_formatted" +%s.%N) seconds ago" +%s.%N`
if awk 'BEGIN{exit ARGV[1]>ARGV[2]}' "$dateDiff" "0"
then
printf "\nadding phone file in q8 loop on dateDiff
$dateDiff , $savePhoneCurrentTimeCodeInProgress_to_find_formatted is less
than or equal to $ltc_to_process_formatted"
printf "file %s\n" "${phoneVideoFile}" >> all.txt
printf "%s\n" "${phoneVideoFile}.wav" >> debug.txt
else
printf "\nin q8 loop no action taken on phone video file
"${phoneVideoFile}" , dateDiff $dateDiff ,
$savePhoneCurrentTimeCodeInProgress_to_find_formatted greater than
$ltc_to_process_formatted"
fi
fi
if [[ $isLTCDumpOutputValid -eq 0 && $q8TimeCodeInProgress -eq 1
]]; then
printf "\nfound LTC error while processing files in range, just
accept it"
printf "\nadding video to q8 file processed list"
printf "file %s\n" "${q8VideoFile}" >> all.txt
printf "%s\n" "${q8VideoFile}.wav" >> debug.txt
continue
fi
if [[ $isLTCDumpOutputValid -eq 0 ]]; then
printf "\nFound ltc error outside time range while processing a
q8 file out of range, reject all q8 videos when this happens"
printf "\nskipping file: "
printf " %s" "${q8VideoFile}"
continue
fi
dateDiff=0
dateDiff=`date -d "$ltc_to_process_formatted $(date -d
"$find_timecode_formatted" +%s.%N) seconds ago" +%s.%N`
if awk 'BEGIN{exit ARGV[1]>ARGV[2]}' "0" "$dateDiff"
then
printf "\nproceeding on file "${q8VideoFile}" , dateDiff
$dateDiff , ltc_to_process_formatted $ltc_to_process_formatted is greater
than or equal to find_timecode_formatted $find_timecode_formatted"
else
printf "\nskipping file "${q8VideoFile}" on dateDiff $dateDiff
, ltc_to_process_formatted $ltc_to_process_formatted is before
find_timecode_formatted $find_timecode_formatted"
continue
fi
dateDiff=0
dateDiff=`date -d "$ltc_to_process_formatted $(date -d
"$next_timecode_to_find_formatted" +%s.%N) seconds ago" +%s.%N`
if awk 'BEGIN{exit ARGV[1]>ARGV[2]}' "$dateDiff" "0"
then
printf "\nproceeding on dateDiff $dateDiff ,
$ltc_to_process_formatted is less than or equal to
$next_timecode_to_find_formatted"
else
printf "\nexecuting break on file "${q8VideoFile}" , dateDiff
$dateDiff , ltc_to_process_formatted $ltc_to_process_formatted is greater
than next_timecode_to_find $next_timecode_to_find"
break
fi
q8TimeCodeInProgress=1
printf "\nfound ltc in range"
printf "\nadding video to q8 file processed list"
printf "file %s\n" "${q8VideoFile}" >> all.txt
printf "%s\n" "${q8VideoFile}.wav" >> debug.txt
done < q8.ffcat
q8TimeCodeInProgress=0
if [[ ! -f "q8_processed.txt" ]]; then
printf "\n\nCould not find file: q8_processed.txt , no timecode in q8
files found between $timecode_to_find and $next_timecode_to_find\n"
exit
else
printf "\nq8 loop completed, removing files process from queue by:
grep -F -v -f q8_processed.txt q8.ffcat > q8_files_not_processed.txt"
grep -F -v -f q8_processed.txt q8.ffcat > q8_files_not_processed.txt
mv q8_files_not_processed.txt q8.ffcat
fi
# reset everything for next loop
let epoch_secs_rejectBeforeTime=$epoch_secs_next_timecode_to_find+1
reject_timecode=`date +%H:%M:%S:%N --date="Jan 1, 1970 00:00:00 +0000
$epoch_secs_rejectBeforeTime seconds" | cut -b1-11 | sed 's/\(.*\):/\1./'
`
rejectBeforeTime_formatted="$timecode_date ${reject_timecode}"
hasRejectBeforeTime=1
increment=$(( $timeDivisionInSeconds * 2 ))
let epoch_secs_timecode_to_find=$epoch_secs_timecode_to_find+$increment
find_timecode=`date +%H:%M:%S:%N --date="Jan 1, 1970 00:00:00 +0000
$epoch_secs_timecode_to_find seconds" | cut -b1-11 | sed 's/\(.*\):/\1./' `
find_timecode_formatted="$timecode_date ${find_timecode}"
let
epoch_secs_next_timecode_to_find=$epoch_secs_next_timecode_to_find+$increment
next_timecode_to_find=`date +%H:%M:%S:%N --date="Jan 1, 1970 00:00:00
+0000 $epoch_secs_next_timecode_to_find seconds" | cut -b1-11 | sed
's/\(.*\):/\1./' `
next_timecode_to_find_formatted="$timecode_date ${next_timecode_to_find}"
printf "\nloop completed, timecode_to_find has been reset: "
printf " %s" "${find_timecode_formatted}"
printf "\nnext_timecode_to_find_formatted has been reset: "
printf " %s" "${next_timecode_to_find_formatted}"
printf "\nrejectBeforeTime_formatted has been reset: "
printf " %s" "${rejectBeforeTime_formatted}"
done < phone.ffcat
printf "\nExecuting: ffmpeg -v error -nostdin -f concat -fflags +genpts
-async 1 -safe 0 -r 29.97 -i all.txt -c copy -crf 0 all.mov"
ffmpeg -y -v error -nostdin -f concat -fflags +genpts -async 1 -safe 0 -r
29.97 -i all.txt -c copy -refs 1 -x264opts b-pyramid=0 -crf 0 all.mov
# debug
ffmpeg -y -i all.mov -vn -c:a pcm_s16le -ar 48000 -ac 2 all.wav
# can't figure out why the concat is creating a variable rate when the
segment creates 29.97
ffmpeg -y -v error -nostdin -i all.mov -r 29.97 -refs 1 -x264opts
b-pyramid=0 -crf 0 -c:a pcm_s16le -c:v libx264 fixedall.mov
# debug
ffmpeg -y -v error -i fixedall.mov -vn -c:a pcm_s16le -ar 48000 -ac 2
fixedall.wav
while read wavFile; do
ltc_out=`ltcdump $wavFile 2>/dev/null `
printf "### output from file %s\n\n" "${wavFile}" >> debug_out.txt
printf "%s\n\n" "${ltc_out}" >> debug_out.txt
done < debug.txt | sort -V
exit
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ardour.org/pipermail/ardour-users-ardour.org/attachments/20180424/35b9bf1f/attachment-0001.html>
More information about the Ardour-Users
mailing list