GNU/Linux >> Znalost Linux >  >> Linux

Převést video na pevnou velikost obrazovky oříznutím a změnou velikosti?

Snažil jsem se na to přijít sám, ale nesčetné množství možností mě jen mate.

Chci použít ideálně buď ffmpeg nebo mencoder (nebo něco jiného, ​​ale ty dva, o kterých vím, že fungují) pro převod jakéhokoli příchozího videa na pevnou velikost obrazovky.

Pokud je video širší nebo příliš krátké, ořízněte jej na střed. Pokud to potom není správná velikost, změňte velikost nahoru nebo dolů, aby byla přesně na pevnou velikost obrazovky.

Přesná poslední věc, kterou potřebuji, je 720×480 v XVid AVI se zvukovou stopou MP3.

Našel jsem spoustu stránek, které ukazují, jak změnit velikost na maximální rozlišení, ale potřebuji, aby video mělo přesně toto rozlišení (s oříznutými částmi navíc, bez černých pruhů).

Může mi někdo říct, že se má spustit příkazový řádek – nebo mě tam alespoň trochu/většinu cesty dostat? Pokud je potřeba více příkazových řádků (spusťte X, abyste získali rozlišení, proveďte tento výpočet a poté spusťte Y s výstupem tohoto výpočtu), mohu to naskriptovat.

Přijatá odpověď:

Nejsem žádný ffmpeg guru, ale tohle by mělo stačit.

Nejprve můžete získat velikost vstupního videa takto:

ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width in.mp4

S přiměřeně aktuálním ffmpegem můžete změnit velikost videa pomocí těchto možností:

ffmpeg -i in.mp4 -vf scale=720:480 out.mp4

Šířku nebo výšku můžete nastavit na -1 aby bylo možné ffmpeg změnit velikost videa při zachování poměru stran. Vlastně -2 je lepší volbou, protože vypočtená hodnota by měla být stejná. Takže můžete napsat:

ffmpeg -i in.mp4 -vf scale=720:-2 out.mp4

Jakmile video získáte, může být větší než očekávané 720x480 protože jste nechali ffmpeg vypočítejte výšku, takže ji budete muset oříznout. To lze provést takto:

ffmpeg -i in.mp4 -filter:v "crop=in_w:480" out.mp4

Konečně byste mohli napsat skript, jako je tento (lze jej snadno optimalizovat, ale kvůli čitelnosti jsem ho nechal jednoduchý):

#!/bin/bash

FILE="//eadn-wc01-5196795.nxedge.io/tmp/test.mp4"
TMP="//eadn-wc01-5196795.nxedge.io/tmp/tmp.mp4"
OUT="//eadn-wc01-5196795.nxedge.io/tmp/out.mp4"

OUT_WIDTH=720
OUT_HEIGHT=480

# Get the size of input video:
eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width ${FILE})
IN_WIDTH=${streams_stream_0_width}
IN_HEIGHT=${streams_stream_0_height}

# Get the difference between actual and desired size
W_DIFF=$[ ${OUT_WIDTH} - ${IN_WIDTH} ]
H_DIFF=$[ ${OUT_HEIGHT} - ${IN_HEIGHT} ]

# Let's take the shorter side, so the video will be at least as big
# as the desired size:
CROP_SIDE="n"
if [ ${W_DIFF} -lt ${H_DIFF} ] ; then
  SCALE="-2:${OUT_HEIGHT}"
  CROP_SIDE="w"
else
  SCALE="${OUT_WIDTH}:-2"
  CROP_SIDE="h"
fi

# Then perform a first resizing
ffmpeg -i ${FILE} -vf scale=${SCALE} ${TMP}

# Now get the temporary video size
eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width ${TMP})
IN_WIDTH=${streams_stream_0_width}
IN_HEIGHT=${streams_stream_0_height}

# Calculate how much we should crop
if [ "z${CROP_SIDE}" = "zh" ] ; then
  DIFF=$[ ${IN_HEIGHT} - ${OUT_HEIGHT} ]
  CROP="in_w:in_h-${DIFF}"
elif [ "z${CROP_SIDE}" = "zw" ] ; then
  DIFF=$[ ${IN_WIDTH} - ${OUT_WIDTH} ]
  CROP="in_w-${DIFF}:in_h"
fi

# Then crop...
ffmpeg -i ${TMP} -filter:v "crop=${CROP}" ${OUT}

Linux
  1. Jak a kde je $term interpretován?

  2. Jak zmenšit velikost videa pomocí Ffmpeg?

  3. Rozdíl mezi velikostí bloku a velikostí clusteru?

  1. Jak programově vytvářet videa?

  2. Změna velikosti okna na nastavenou velikost v Linuxu

  3. tmpfs použití a změna velikosti

  1. Vdx – Intuitivní obálka příkazového řádku do FFmpeg

  2. Stáhněte si část videa z Youtube s Youtube-dl a FFmpeg

  3. Nahrávání obrazovky v Linuxu s OBS a Wayland