[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