[Ardour-Users] "Extract LTC from audio and align video" menu option missing from "Transcode/Import Video file" popup

robertlazarski robertlazarski at gmail.com
Wed May 16 09:51:48 PDT 2018


Just to close this thread out, I finally was able to write a script that
combines two camera videos.

I do have one problem still with Ardour or ffmpeg, please see my update
in-line.

On Tue, Apr 24, 2018 at 1:30 PM, robertlazarski <robertlazarski at gmail.com>
wrote:

> 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?
>
>
>
There was several issues here, I suspect write speed was one of them so I
put in class 10 SD in the Q8 pair and F8 which seemed to help.

Really the main issue though was scripting ffmpeg with segments didn't pan
out. I asked a question on the ffmpeg list but had no response, I will
follow up there with the details. I had much better luck using ffmpeg "ss"
and "to" params by calculating the times with the sample position of the
ltc.

I was able to do a calculated camera transition between the pair of Q8
cameras that way with a little less than .5 millseconds or around 20 sample
positions missing in the transitions. I tried to do better but ran out of
ideas.  I may try again at some point.

The one Ardour problem I still have is that when exporting a video, I do
not see the PMC option for the F8 24 bit audio, I only see pcm_s16le . See
the output below from mediainfo on the F8 file:

Audio
Format                                   : PCM
Format settings                          : Little / Signed
Codec ID                                 : 1
Duration                                 : 3 min 10 s
Bit rate mode                            : Constant
Bit rate                                 : 4 608 kb/s
Channel(s)                               : 4 channels
Sampling rate                            : 48.0 kHz
Bit depth                                : 24 bits
Stream size                              : 104 MiB (100%)

I see this from ffmpeg, I am not sure if I need 24 bits or 32 bits?

ffmpeg -v error -formats | grep -i pcm | grep 24 | grep little-endian |
grep -v unsigned

DE s24le           PCM signed 24-bit little-endian

ffmpeg -v error -formats | grep -i pcm | grep 32 | grep little-endian |
grep -v unsigned

 DE f32le           PCM 32-bit floating-point little-endian
 DE s32le           PCM signed 32-bit little-endian

However in Ardour when exporting a mov video I only see this pcm audio
option in the audio codec drop down:

pcm_s16le

Any guidance appreciated.

This is how my script turned out. At some point I may install Davinci
Resolve but it requires CentOS 7 and that's not my distro. This script will
be what I use for the next few months as I kind of like the idea of auto
editing. Will see how far it gets me.

#!/bin/bash

# This script generates a single video from parts of videos from 2 Zoom Q8
cameras
# by using ltc on ch1 of each video. The priority is as little ltc audio
drift as possible,
# script performance and extra transcoding are not an issue. Little audio
drift in this case
# means the start and end times match the source videos closely, with no
dropped video frames
# nor dropped ltc frames. I was able to get within .2 seconds by the end of
the video,
# and while I have no immediate ideas how to do better I will continue to
try.

# The ltc comes from 2 Tentacle Sync units, that were 'jammed' to a
# Zoom F8. The main idea is to sync the video with the BWF 8 track audio
generated on
# on the Zoom F8 via Ardour. This is possible by using the BWF timecode
metadata, and
# ltc on ch1 of the video. ch2 contains a scratch track.

# A fixed duration such as 20 seconds is set, indicating a camera
# transision. Videos are mov at 1280x720 with ltc audio at 48KHZ / 16 bits.

# usage:
# /home/myuser/input> ls
# output  parseLTC.sh  q81.mov  q82.mov
# /home/myuser/input> cd output/
# /home/myuser/input/output> sh ../parseLTC.sh

# clear any files from previous processing
rm -f *.txt
rm -f *cut*
rm -f *.csv

# read LTC from wav files, first camera is q81 and the second camera is q82
ffmpeg -y -v error -nostdin -i ../q81.mov -vn -c:a pcm_s16le -ar 48000 -ac
2 q81.wav
ffmpeg -y -v error -nostdin -i ../q82.mov -vn -c:a pcm_s16le -ar 48000 -ac
2 q82.wav

ltcdump -f 29.97 q81.wav 2> /dev/null > q81.ltc.txt
ltcdump -f 29.97 q82.wav 2> /dev/null > q82.ltc.txt

# some errors I found while playing option bingo with ffmpeg
validate() {
    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
    startingSamplePositionInSegment=0
    startingSamplePositionInSegment=`tail -n 1 ltc.txt | awk '{ print $4 }'
| sed 's/\(.*\):/\1./'  `
    endingSamplePositionInSegment=0
    endingSamplePositionInSegment=`tail -n 1 ltc.txt | awk '{ print $5 }' |
sed 's/\(.*\):/\1./'  `
    printf "\nltc seems valid"
    isLTCDumpOutputValid=1
}

# define timecode start time, just add date
timecode_date=2018-05-16
# skip segments before this timecode
epoch_secs_start_time=$(date +%s --date="$timecode_date 00:04:25")
start_timecode=`date +%H:%M:%S:%N --date="Jan 1, 1970 00:00:00 +0000
$epoch_secs_start_time seconds" | cut -b1-11  | sed 's/\(.*\):/\1./' `
start_time_formatted="$timecode_date $start_timecode"
# define timecode stop time
epoch_secs_stop_time=$(date +%s --date="$timecode_date 00:07:10")
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}"

q81HasLTCStartTime=0
hasRejectBeforeTime=0
q81TimeCodeInProgress=0
q82TimeCodeInProgress=0
q81PositionTimeStart=''
q81PositionTimeStop=''
q82PositionTimeStart=''
q82PositionTimeStop=''
fourtyEightKHZ=48000

while read -r lineq81
do
    ltc_line=''
    ltc_line="$lineq81"
    hasLTC=0
    hasLTC=`echo $ltc_line | grep -v '#' | grep ':' | wc -w`
    if [[ $hasLTC -eq 0 ]]; then
        printf "\ncannot parse timecode on line: $ltc_line \n"
        continue
    fi
    rm -f ltc.txt
    # find timecode in format 'HH:MM:SS.00' with frames as last 2 digits
used for .00 time.
    # remove occasional '.' in the form 00:00:00.0 instead of 00:00:00:0
    # remove negative values
    # disallow 0000000f   00:12:25:45
    echo $ltc_line | grep -v '#' | grep 00000000 | grep -v '\.' | grep -v
'-' > ltc.txt
    validate
    if [[ $found_stop_time -eq 1 ]]; then
        printf "\nq81 video is after stop time, executing break after
writing last csv entry\n"
        if [[ $q81PositionTimeStart != '' && $q81PositionTimeStop != '' ]];
then
            printf "\nExecuting: echo
$q81PositionTimeStart","$q81PositionTimeStop >> q81_out.csv"
            echo  $q81PositionTimeStart","$q81PositionTimeStop >>
q81_out.csv
        fi
        break
    fi
    if [[ $q81HasLTCStartTime -eq 0 && $isLTCDumpOutputValid -eq 0 ]]; then
        printf "\non q81HasLTCStartTime=0 and isLTCDumpOutputValid=0 ...
skipping"
        continue
    fi
    if [[ $q81HasLTCStartTime -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
            q81HasLTCStartTime=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 ...\n"
            samplePositionOffsetQ81=0
            samplePositionOffsetQ81=$(awk "BEGIN {printf
\"%.6f\",${startingSamplePositionInSegment}/${fourtyEightKHZ}}")
            q81PositionTimeStart=$samplePositionOffsetQ81
            printf "\ncalculated first start position on q81:
$q81PositionTimeStart\n"
        else
            printf "\non dateDiff $dateDiff , ltc_to_process_formatted
$ltc_to_process_formatted is before start_time_formatted
$start_time_formatted"
            printf "\nskipping ...\n"
            continue
        fi
    fi
    if [[ $isLTCDumpOutputValid -eq 0 && $q81TimeCodeInProgress -eq 1 ]];
then
        printf "\nq81 video is the default and is in progress, occasional
bad timecode values are ok"
        continue
    fi
    if [[ $isLTCDumpOutputValid -eq 0 && $q81TimeCodeInProgress -eq 0 ]];
then
        printf "\nskipping , ltc is invalid and q81TimeCodeInProgress is
false: "
        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 , dateDiff $dateDiff ,
ltc_to_process_formatted $ltc_to_process_formatted is before or equal to
rejectBeforeTime_formatted $rejectBeforeTime_formatted \n"
            continue
        else
            printf "\nproceeding , 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 later than or equal to find_timecode_formatted
$find_timecode_formatted \n"
    else
        printf "\non dateDiff $dateDiff , ltc_to_process_formatted
$ltc_to_process_formatted is less than find_timecode_formatted
$find_timecode_formatted \n"
        printf "\nproceeding ..."

        if [[ $q81TimeCodeInProgress -eq 0 ]]; then
            samplePositionOffsetQ81=0
            samplePositionOffsetQ81=$(awk "BEGIN {printf
\"%.6f\",${startingSamplePositionInSegment}/${fourtyEightKHZ}}")
            q81PositionTimeStart=$samplePositionOffsetQ81
            printf "\ncalculated samplePositionOffsetQ81:
$samplePositionOffsetQ81 , from $startingSamplePositionInSegment /
$fourtyEightKHZ"
        else
            # will reset on each loop
            q81PositionTimeStop=0
            q81PositionTimeStop=$(awk "BEGIN {printf
\"%.6f\",${endingSamplePositionInSegment}/${fourtyEightKHZ}}")
            printf "\nfound q81PositionTimeStop $q81PositionTimeStop"
        fi
        q81TimeCodeInProgress=1
        continue
    fi

    printf "\nfound find_timecode: "
    printf " %s" "${find_timecode}"
    printf "\nwill now process the q82 files looking for timecode later
than or equal to: "
    printf " %s" "${find_timecode_formatted}"
    printf "\nand timecode before or equal to: "
    printf " %s" "${next_timecode_to_find_formatted}"

    if [[ $q81PositionTimeStart != '' && $q81PositionTimeStop != '' ]]; then
        printf "\nExecuting: echo
$q81PositionTimeStart","$q81PositionTimeStop >> q81_out.csv"
        echo  $q81PositionTimeStart","$q81PositionTimeStop >> q81_out.csv
    else
        printf "\nloop completed without valid timecode, executing break"
        break
    fi
    q81PositionTimeStop=0
    q81TimeCodeInProgress=0
    samplePositionOffsetQ82=0
    q81PositionTimeStart=''
    q81PositionTimeStop=''
    while read -r lineq82
    do
        ltc_line=''
        ltc_line="$lineq82"
        hasLTC=0
        hasLTC=`echo $ltc_line | grep -v '#' | grep ':' | wc -w`
        if [[ $hasLTC -eq 0 ]]; then
            printf "\ncannot parse timecode on line: $ltc_line \n"
            continue
        fi
        rm -f ltc.txt
        # find timecode in format 'HH:MM:SS.00' with frames as last 2
digits used for .00 time.
        # remove occasional '.' in the form 00:00:00.0 instead of
00:00:00:0
        # remove negative values
        # disallow 0000000f   00:12:25:45
        echo $ltc_line | grep -v '#' | grep 00000000 | grep -v '\.' | grep
-v '-' > ltc.txt
        validate
        if [[ $found_stop_time -eq 1 ]]; then
            printf "\nq82 video is after stop time, executing break after
writing last csv entry\n"
            break
        fi
        if [[ $isLTCDumpOutputValid -eq 0 && $q82TimeCodeInProgress -eq 1
]]; then
            printf "\nfound LTC error while q82TimeCodeInProgress=1,
skipping"
            continue
        fi
        if [[ $isLTCDumpOutputValid -eq 0 ]]; then
            printf "\nFound ltc error outside time range while processing
q82 , skipping"
            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 , dateDiff $dateDiff ,
ltc_to_process_formatted $ltc_to_process_formatted is later or equal to
find_timecode_formatted $find_timecode_formatted"
        else
            printf "\nskipping q82 timecode 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 before or equal to
$next_timecode_to_find_formatted"
        else
            printf "\nexecuting break  , dateDiff $dateDiff ,
ltc_to_process_formatted $ltc_to_process_formatted is greater than
next_timecode_to_find $next_timecode_to_find"
            break
        fi

        if [[ $q82TimeCodeInProgress -eq 0 ]]; then
            samplePositionOffsetQ82=0
            samplePositionOffsetQ82=$(awk "BEGIN {printf
\"%.6f\",${startingSamplePositionInSegment}/${fourtyEightKHZ}}")
            q82PositionTimeStart=$samplePositionOffsetQ82
            printf "\ncalculated q82PositionTimeStart:
$q82PositionTimeStart , from $startingSamplePositionInSegment /
$fourtyEightKHZ"
        else
            # will reset on each loop
            samplePositionOffsetQ82=0
            samplePositionOffsetQ82=$(awk "BEGIN {printf
\"%.6f\",${endingSamplePositionInSegment}/${fourtyEightKHZ}}")
            q82PositionTimeStop=$samplePositionOffsetQ82
            printf "\ncalculated q82PositionStopTime: $q82PositionTimeStop
, from $endingSamplePositionInSegment / $fourtyEightKHZ"
        fi
        q82TimeCodeInProgress=1
        printf "\nfound ltc in range. loop ended"

  done < q82.ltc.txt
  if [[ $q82PositionTimeStart != '' && $q82PositionTimeStop != '' ]]; then
      printf "\nExecuting: echo
$q82PositionTimeStart","$q82PositionTimeStop >> q82_out.csv"
      echo  $q82PositionTimeStart","$q82PositionTimeStop >> q82_out.csv
   else
      printf "\nloop completed without valid timecode, executing break"
      break
  fi
  q82TimeCodeInProgress=0
  q82PositionTimeStart=''
  q82PositionTimeStop=''
  # reset everything for next loop
  let epoch_secs_rejectBeforeTime=$epoch_secs_next_timecode_to_find
  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 < q81.ltc.txt

xx=0
while IFS=, read -r col1 col2
do
    printf "\nExecuting: ffmpeg -y -v error -nostdin -i ../q81.mov -ss
$col1 -to $col2 -c:a pcm_s16le -c:v libx264 -refs 1 -x264opts b-pyramid=0
-r 30000/1001 -threads 0 -s 1280x720 -b:v: 1024k -bufsize 1216k -maxrate
1280k -b:a 192k -sample_fmt s16 -ac 2 -ar 48000 -af
"aresample=async=1:min_hard_comp=0.000100:first_pts=0" -crf 0
q81_cut_"$xx".mov"
    ffmpeg -y -v error -nostdin -i ../q81.mov -ss $col1 -to $col2 -c:a
pcm_s16le -c:v libx264 -refs 1 -x264opts b-pyramid=0 -r 30000/1001 -threads
0 -s 1280x720 -b:v: 1024k -bufsize 1216k -maxrate 1280k -b:a 192k
-sample_fmt s16 -ac 2 -ar 48000 -af
"aresample=async=1:min_hard_comp=0.000100:first_pts=0" -crf 0
q81_cut_"$xx".mov
    # debug
    printf "\nExecuting: ffmpeg -y -v error -nostdin -i q81_cut_"$xx".mov
-vn -acodec pcm_s16le -ar 48000 -ac 2 "q81_cut_"$xx".mov.wav" "
    ffmpeg -y -v error -nostdin -i q81_cut_"$xx".mov -vn -acodec pcm_s16le
-ar 48000 -ac 2 "q81_cut_"$xx".mov.wav"
    xx=$((xx + 1))
done < q81_out.csv

yy=0
while IFS=, read -r col1 col2
do
    printf "\nExecuting: ffmpeg -y -v error -nostdin -i ../q82.mov -ss
$col1 -to $col2 -c:a pcm_s16le -c:v libx264 -refs 1 -x264opts b-pyramid=0
-r 30000/1001 -threads 0 -s 1280x720 -b:v: 1024k -bufsize 1216k -maxrate
1280k -b:a 192k -sample_fmt s16 -ac 2 -ar 48000 -af
"aresample=async=1:min_hard_comp=0.000100:first_pts=0" -crf 0
q82_cut_"$yy".mov"
    ffmpeg -y -v error -nostdin -i ../q82.mov -ss $col1 -to $col2 -c:a
pcm_s16le -c:v libx264 -refs 1 -x264opts b-pyramid=0 -r 30000/1001 -threads
0 -s 1280x720 -b:v: 1024k -bufsize 1216k -maxrate 1280k -b:a 192k
-sample_fmt s16 -ac 2 -ar 48000 -af
"aresample=async=1:min_hard_comp=0.000100:first_pts=0" -crf 0
q82_cut_"$yy".mov

    printf "\nExecuting: ffmpeg -y -v error -nostdin -i q82_cut_"$yy".mov
-vn -acodec pcm_s16le -ar 48000 -ac 2 "q82_cut_"$yy".mov.wav" "
    # debug
    ffmpeg -y -v error -nostdin -i q82_cut_"$yy".mov -vn -acodec pcm_s16le
-ar 48000 -ac 2 "q82_cut_"$yy".mov.wav"
    yy=$((yy + 1))
done < q82_out.csv

zz=0
if [[ $xx -eq $yy ]]; then
    zz=$xx
elif [[ $xx -gt $yy ]]; then
    zz=$xx
else
    zz=$yy
fi

for (( c=0; c<$zz; c++ ))
do
   printf "\nExecuting: ls *cut_"$c"*.mov | sort | sed 's/^/file /' >>
cuts.txt"
   ls *cut_"$c"*.mov | sort | sed 's/^/file /' >> cuts.txt
done

printf "\nExecuting: ffmpeg -y -v error -nostdin -f concat -fflags +genpts
-safe 0 -i cuts.txt -c:a pcm_s16le -c:v libx264 -refs 1 -x264opts
b-pyramid=0 -r 30000/1001 -threads 0 -s 1280x720 -b:v: 1024k -bufsize 1216k
-maxrate 1280k -b:a 192k -sample_fmt s16 -ac 2 -ar 48000 -af
"aresample=async=1:min_hard_comp=0.000100:first_pts=0" -crf 0 cuts.mov"

ffmpeg -y -v error -nostdin -f concat -fflags +genpts -safe 0 -i cuts.txt
-c:a pcm_s16le -c:v libx264 -refs 1 -x264opts b-pyramid=0 -r 30000/1001
-threads 0 -s 1280x720 -b:v: 1024k -bufsize 1216k -maxrate 1280k -b:a 192k
-sample_fmt s16 -ac 2 -ar 48000 -af
"aresample=async=1:min_hard_comp=0.000100:first_pts=0" -crf 0 cuts.mov

# debug
ffmpeg -y -v error -nostdin -i cuts.mov -vn -c:a pcm_s16le -ar 48000 -ac 2
cuts.wav

exit
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ardour.org/pipermail/ardour-users-ardour.org/attachments/20180516/f3116645/attachment-0001.html>


More information about the Ardour-Users mailing list