Próbowałem samodzielnie to rozgryźć, ale niezliczone opcje po prostu mnie wprawiają w zakłopotanie.

Idealnie chcę użyć albo ffmpeg, albo mencoder (lub czegoś innego, ale wiem, że te dwie rzeczy działają ), aby przekonwertować przychodzące wideo na stały rozmiar ekranu.

Jeśli wideo jest dla niego szersze lub za krótkie, wyśrodkuj je. Jeśli nie ma odpowiedniego rozmiaru, zmień rozmiar w górę lub aby uzyskać dokładnie ten sam rozmiar ekranu.

Ostatnią rzeczą, której potrzebuję, jest 720×480 w formacie XVid AVI ze ścieżką dźwiękową MP3.

Znalazłem wiele stron wyświetlających jak zmienić rozmiar do maksymalnej rozdzielczości, ale potrzebuję, aby wideo miało dokładnie tę rozdzielczość (z obciętymi dodatkowymi częściami, bez czarnych pasków).

Czy ktoś może mi powiedzieć, że wiersz poleceń ma się uruchomić – lub przynajmniej dostać mi część / większość drogi tam? Jeśli potrzeba wielu wierszy poleceń (uruchom X, aby uzyskać rozdzielczość, zrób to jest obliczeniem, a następnie uruchamiam Y z wynikiem tego obliczenia) Mogę to napisać.

Komentarze

  • Najwyraźniej urządzenie wideo działa również z Mpeg4 jako XVid AVI, jeśli to ' jest łatwiejsze / lepsze.

Odpowiedz

Nie jestem guru ffmpeg, ale to powinno załatwić sprawę.

Po pierwsze, możesz uzyskać rozmiar wejściowego wideo w następujący sposób:

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

Dzięki stosunkowo niedawnemu ffmpeg możesz zmienić rozmiar swojego wideo za pomocą następujących opcji:

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

Możesz ustawić szerokość lub wysokość na -1, aby ffmpeg zmienić rozmiar wideo z zachowaniem proporcji. Właściwie -2 jest lepszym wyborem, ponieważ obliczona wartość powinna być parzysta. Możesz więc wpisać:

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

Po otrzymaniu wideo może być większe niż oczekiwane 720x480, ponieważ pozwalasz ffmpeg obliczyć wysokość, więc „będziesz musiał ją przyciąć. Można to zrobić w ten sposób:

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

Na koniec możesz napisać taki skrypt (można go łatwo zoptymalizować, ale dla czytelności postarałem się o prostotę):

#!/bin/bash FILE="/tmp/test.mp4" TMP="/tmp/tmp.mp4" OUT="/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} 

Komentarze

  • Miałem to zabawne wrażenie, że ' przegapiłbym scenariusz, ale ' Próbowałem tego z mnóstwem plików wideo i wydaje się, że prawidłowo przycina i zmienia rozmiar wideo do absolutnie poprawnego rozmiaru – dobra robota!
  • wygląda na to, że jest coś nie tak z decyzją CROP_SIDE.
  • `# Uzyskaj współczynnik między rzeczywistym a pożądanym rozmiarem w_rate = echo "scale=3; ${in_width}/${out_width}*1000"| bc | awk '{printf "%d", $0}' h_rate = echo "scale=3; ${in_height}/${out_height}*1000"| bc | awk '{printf "%d", $0}' # Niech ' s mają krótszy bok, więc wideo będzie przynajmniej tak duży # jak żądany rozmiar i przytnij dłuższy bok: crop_side = ' n ' if [$ {w_rate} -gt $ {h_rate}]; then scale = ” -2: $ {out_height} ” crop_side = ' w ' else scale = ” $ {out_width}: – 2 ” crop_side = ' h ' fi `

Odpowiedź

ffmpeg -i input.file -vf "scale=(iw*sar)*max(720/(iw*sar)\,480/ih):ih*max(720/(iw*sar)\,480/ih), crop=720:480" -c:v mpeg4 -vtag XVID -q:v 4 -c:a libmp3lame -q:a 4 output.avi 

Zastąp„ input.file ”nazwą pliku wejściowego.

Komentarze

  • To powinna być najlepsza odpowiedź, ponieważ nie ' nie wymaga wywołania ffprobe. Zwróć uwagę na sekwencje przecinków z odwrotnym ukośnikiem w poleceniu. ' Będziesz musiał pominąć ukośniki odwrotne, jeśli ' ponownie umieścisz polecenie w ciągu C / JavaScript / PHP.
  • Świetnie, Brian. Część filtra wideo jest dokładnie tym, czego potrzebowałem. (tj. aby przekonwertować stare filmy 4: 3 na 16: 9)!
  • genialny! wszystko zrobione w jednym.
  • Znacznie czystszy niż powyższy skrypt. Uwaga, jeśli nie ' nie chcesz formatu XVID / MP3, możesz po prostu zmienić tagi po drugim cudzysłowie na coś takiego jak -c:a copy scaled_result.mp4
  • czy możesz mi wyjaśnić, co ' s sar wewnątrz iw*sar

Odpowiedź

Jeśli chcesz przyciąć i skalować za jednym razem, możesz utworzyć łańcuch filtrów „przycinaj, a potem skaluj” tak:

ffmpeg -i SomeInput.mp4 -vf "crop=in_h*9/16:in_h,scale=-2:400" -t 4 SomeOutput.mp4 

Powyższe najpierw przycina wideo do formatu 16: 9, a następnie skaluje do 400 pikseli wysokości x odpowiednia (parzysta liczba) szerokość.

Odpowiedź

Jestem nowy w ffmpeg, ale teraz mam fajny mały konwerter działający w VB.NET, który tworzy surowe filmy różne formaty wyjściowe do użytku w małych urządzeniach, które mają dostęp do karty SD, ale nie mają wystarczającej mocy do dekodowania złożonego wideo.

Ze względu na sposób, w jaki działa podczas zmiany rozmiaru i kadrowania, musiałem zakodować go ręcznie i zbudować parametry. Zasadniczo muszę znać wynikową szerokość i wysokość.

Mam 2 pola wyboru dla opcji: –

Zachowaj proporcje (X) Wypełnij wszystkie piksele (X)

Potrzebne są tylko 4 zmienne jako dane wejściowe (1) Oryginalna szerokość wideo, (2) Oryginalna wysokość wideo, (3) Szerokość urządzenia, (4) Wysokość urządzenia.

Chociaż dla VB.NET można by dość łatwo dostosować do dowolnego języka.

 Dim crop As String = "" " will build this in ffmpeg format for -s or scale and crop If cbAspectRatio.Checked = False Then m_dest_output_w = sz._w m_dest_output_h = sz._h " scale to w * h - simple crop = " -s " & m_dest_output_w & ":" & m_dest_output_h Else Dim ratio As Double = CDbl(m_video_width) / CDbl(m_video_height) " this is aspect ratio of original unsized video If cbFillPixels.Checked = False Then " shrink to fit If sz._w * ratio <= m_video_height Then m_dest_output_w = sz._w m_dest_output_h = sz._w / ratio Else m_dest_output_h = sz._h m_dest_output_w = sz._h / ratio End If " no cropping just resizing to a non-filled area that fits crop = " -s " & m_dest_output_w & ":" & m_dest_output_h " no cropping needed as letterboxed Else " expand / fill --- cropping needed If sz._w * ratio >= m_video_height Then m_dest_output_w = sz._w m_dest_output_h = sz._w * ratio crop = ",crop=" & sz._w & ":" & sz._h & ":0:" & Math.Abs((m_dest_output_h - sz._h)) \ 2 Else m_dest_output_h = sz._h m_dest_output_w = sz._h * ratio crop = ",crop=" & sz._w & ":" & sz._h & ":" & Math.Abs((m_dest_output_w - sz._w)) \ 2 & ":0" End If crop = " -vf scale=" & m_dest_output_w & ":" & m_dest_output_h & crop m_dest_output_w = sz._w m_dest_output_h = sz._h End If End If 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *