GNU/Linux >> Znalost Linux >  >> Linux

Stříhání videí na základě času začátku a konce pomocí ffmpeg

Zkuste použít toto. Je to nejrychlejší a nejlepší způsob ffmpeg, jak jsem na to přišel:

 ffmpeg -ss 00:01:00 -to 00:02:00  -i input.mp4 -c copy output.mp4

Tento příkaz ořízne vaše video během několika sekund!

Vysvětlení příkazu:

-i: To určuje vstupní soubor. V tom případě je (vstup.mp4).
-ss: Používá se s -i, hledá ve vstupním souboru (input.mp4) pozici.
00:01:00: Toto je čas, kterým vaše oříznuté video začne.
-to: Toto určuje dobu trvání od začátku (00:01:40) do konce (00:02:12).
00:02:00: To je čas, kterým vaše oříznuté video skončí.
-c kopie: Toto je možnost oříznutí prostřednictvím kopírování streamu. (Pozn.:Velmi rychle)

Formát časování je:hh:mm:ss

Upozorňujeme, že současná vysoce kladná odpověď je zastaralá a úprava by byla extrémně pomalá. Další informace naleznete v tomto oficiálním článku ffmpeg.


Zde je to, co používám a zabere to jen několik sekund spustit:

ffmpeg -i input.mp4 -ss 01:19:27 -to 02:18:51 -c:v copy -c:a copy output.mp4

Reference:Ořízněte video soubory pomocí FFmpeg od Alexander Refsum Jensenius .

Vygenerováno mp4 soubory lze také použít v iMovie . Další informace týkající se získání celé doby trvání pomocí modelu get_duration(input_video).

Pokud chcete zřetězit více scén, můžete použít následující skript Python:

#!/usr/bin/env python3

import subprocess

def get_duration(input_video):
    cmd = ["ffprobe", "-i", input_video, "-show_entries", "format=duration",
           "-v", "quiet", "-sexagesimal", "-of", "csv=p=0"]
    return subprocess.check_output(cmd).decode("utf-8").strip()


def main():
    name = "input.mkv"
    times = []
    times.append(["00:00:00", "00:00:10"])
    times.append(["00:06:00", "00:07:00"])
    # times = [["00:00:00", get_duration(name)]]
    if len(times) == 1:
        time = times[0]
        cmd = ["ffmpeg", "-i", name, "-ss", time[0], "-to", time[1], "-c:v", "copy", "-c:a", "copy", "output.mp4"]
        subprocess.check_output(cmd)
    else:
        open('concatenate.txt', 'w').close()
        for idx, time in enumerate(times):
            output_filename = f"output{idx}.mp4"
            cmd = ["ffmpeg", "-i", name, "-ss", time[0], "-to", time[1], "-c:v", "copy", "-c:a", "copy", output_filename]
            subprocess.check_output(cmd)

            with open("concatenate.txt", "a") as myfile:
                myfile.write(f"file {output_filename}\n")

        cmd = ["ffmpeg", "-f", "concat", "-i", "concatenate.txt", "-c", "copy", "output.mp4"]
        output = subprocess.check_output(cmd).decode("utf-8").strip()
        print(output)


if __name__ == "__main__":
    main()

Ukázkový skript vystřihne a sloučí scény mezi 00:00:00 - 00:00:10 a 00:06:00 - 00:07:00 .

Pokud chcete vystřihnout celé video (v případě, že chcete převést mkv formátovat do mp4 ) stačí odkomentovat následující řádek:

# times = [["00:00:00", get_duration(name)]]

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -c copy cut.mp4 

Použijte -c copy pro okamžité provedení. V takovém případě ffmpeg video znovu nekóduje, pouze ořízne podle velikosti.


Pravděpodobně nemáte klíčový snímek na značce 3 sekund. Protože neklíčové snímky kódují rozdíly od ostatních snímků, vyžadují všechna data počínaje předchozím klíčovým snímkem.

S kontejnerem mp4 je možné stříhat na neklíčový snímek bez překódování pomocí seznamu úprav. Jinými slovy, pokud je nejbližší klíčový snímek před 3 s na 0 s, zkopíruje se video začínající na 0 s a pomocí seznamu úprav řekne přehrávači, aby začal hrát za 3 sekundy.

Pokud používáte nejnovější ffmpeg z git master, provede to pomocí seznamu úprav při vyvolání pomocí příkazu, který jste poskytli. Pokud vám to nefunguje, pak pravděpodobně používáte starší verzi ffmpeg nebo váš přehrávač nepodporuje seznamy úprav. Některé přehrávače budou ignorovat seznam úprav a vždy přehrají všechna média v souboru od začátku do konce.

Pokud chcete střih přesně počínaje neklíčovým snímkem a chcete, aby se přehrával od požadovaného bodu na přehrávači, který nepodporuje seznamy úprav, nebo chcete zajistit, aby se střih ve skutečnosti nenacházel ve výstupním souboru (např. pokud obsahuje důvěrné informace), můžete to provést překódováním tak, aby byl klíčový snímek přesně v požadovaném čase zahájení. Překódování je výchozí, pokud nezadáte copy . Například:

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4

Při překódování můžete také chtít zahrnout další možnosti související s kvalitou nebo konkrétní kodér AAC. Podrobnosti najdete v ffmpeg x264 Encoding Guide pro video a AAC Encoding Guide pro audio.

Také -t volba určuje dobu trvání, nikoli čas ukončení. Výše uvedený příkaz zakóduje 8s videa počínaje 3s. Chcete-li začít na 3 s a skončit na 8 s, použijte -t 5 . Pokud používáte aktuální verzi ffmpeg, můžete také nahradit -t s -to ve výše uvedeném příkazu skončí v určený čas.


Linux
  1. Kdy jste naposledy použili Windows?

  2. Jak otočit videa pomocí FFMpeg z příkazového řádku

  3. Jaký je rozdíl v přesměrování výstupu pomocí >, &>, >&a 2&>?

  1. Jak převést videa m4v a wmv do formátu mp4 pomocí ffmpeg?

  2. Jaký je rozdíl mezi použitím `sh` a `source`?

  3. Systemd:Použití After a Requires

  1. Co je to Rolling Release Linux a jaký je skutečný přínos jeho používání

  2. Kopírovat a chmod/chown zároveň

  3. Ping a tcpdump současně