0

I have the following fish shell script for downloading a slice of a video using yt-dlp and ffmpeg

function yt-dlp-trim -d "Download a slice of a video with yt-dlp"

    if test (count $argv) -lt 3
        echo "Pass a start and end timestamp as well as an URL"
        return 1
    end
    
    # convert a hh:mm:ss.ms input into seconds with decimals
    set -l start (echo $argv[1] | sed -E 's/(.*):(.+):(.+)/\1*3600+\2*60+\3/;s/(.+):(.+)/\1*60+\2/' | bc)
    set -l end (echo $argv[2] | sed -E 's/(.*):(.+):(.+)/\1*3600+\2*60+\3/;s/(.+):(.+)/\1*60+\2/' | bc)
    
    # set output to $XDG_VIDEOS_DIR
    set -l video_dir (xdg-user-dir VIDEOS)
    set -l output $video_dir'/%(title)s.%(ext)s'

    command yt-dlp  -f '(bestvideo[height<=720]+bestaudio/best[height<=720]/best)[protocol!*=dash]'\
            --external-downloader ffmpeg\
            --external-downloader-args ffmpeg:"-ss $start -to $end"\
            -o $output\
            $argv[3..-1]
end

The important part is here:

command yt-dlp  -f '(bestvideo[height<=720]+bestaudio/best[height<=720]/best)[protocol!*=dash]'\
        --external-downloader ffmpeg\
        --external-downloader-args ffmpeg:"-ss $start -to $end"\
        -o $output\
        $argv[3..-1]

Where I run yt-dlp and specify ffmpeg as the external downloader.

The script does its job and works fine if I'm downloading from the start of a video until a certain point. However when I, say, download a video from 00:45 to 00:57 the result is a 12 second video with completely black or dead frames until the 4 second mark and then it proceeds normally until the end of the clip.

I've tried the advice from this answer by removing 30 seconds from $start and using this command

# go 30s back to get good keyframes
set start (math "max($start - 30, 0)")

command yt-dlp  -f '(bestvideo[height<=720]+bestaudio/best[height<=720]/best)[protocol!*=dash]'\
        --external-downloader ffmpeg\
        --external-downloader-args ffmpeg:"-ss $start -ss 30 -to $end"\
        -o $output\
        $argv[3..-1]

But it did not work. Any pointers would be appreciated.

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.