image + audio = mp4: jak zmniejszyć wideo?

12

Używam ffmpeg, aby dodać plik JPG do MP4, aby utworzyć MP4.

Ponieważ jest tylko jeden obraz do zrobienia filmu, zastanawiam się, czy istnieje sposób na zmniejszenie jego rozmiaru?

Komenda:

$ ffmpeg -loop 1 -i image.jpg -i audio.mp3 -shortest -c:a copy output.mp4

Wyniki:

  • image.jpg = 26,7 K (obraz nie jest tak wyraźny)
  • audio.mp3 = 64,6 mln (54 minut)
  • output.mp4 = 80,6 mln (wynik wideo nie jest tak wyraźny, muzyka nadal dobra)

Czy jest to rozsądny rozmiar dla MP4?

SIDU
źródło
Zastanawiam się, czy można meta mp4, aby odtwarzał tylko mp3 i trzymał ekran
ustawiony
Jaki jest docelowy odtwarzacz, urządzenie lub strona wyjściowa?
llogan
Próbuję załadować .mp4 na Youtube.com
SIDU

Odpowiedzi:

18

Do przesłania do YouTube

H.264: najmniejsze pliki

Ta metoda wykorzystuje libx264 do kodowania wideo H.264. Jest wolniejszy niż poniższa metoda kopiowania strumieniowego, ale potencjalnie może wygenerować mniejszy rozmiar pliku.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 \
-c:v libx264 -preset veryslow -crf 0 -c:a copy -shortest output.mkv

Kopiowanie strumieniowe: najszybszy proces

Ta metoda po prostu przesyła strumieniowo kopie (bez kodowania) obrazu do kontenera MKV. Jest super szybki, ale jeśli rozmiar jest ważny, to powyższa metoda może spowodować utworzenie mniejszego pliku.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 -c copy -shortest output.mkv
  • YouTube akceptuje prawie wszystko, więc te polecenia wykorzystują kilka sztuczek, aby przyspieszyć kodowanie lub zmniejszyć rozmiar pliku i utrzymać wysoką jakość, ponieważ YouTube ponownie zakoduje wszystko, co mu dasz. Twojemu odtwarzaczowi prawdopodobnie się to nie spodoba, ale YouTubeowi się spodoba.

  • W tych przykładach zastosowano bardzo niską liczbę klatek na sekundę, która powinna przetwarzać się szybciej niż domyślnie 25 fps.


Największa kompatybilność z każdym odtwarzaczem

ffmpeg -loop 1 -i image.png -i music.mp3 -vf "scale='min(1280,iw)':-2,format=yuv420p" \
-c:v libx264 -preset medium -profile:v main -c:a aac -shortest -movflags +faststart output.mp4
  • Powinno to działać na prawie wszystkim oprócz bardzo starych urządzeń (zmień -profile:v mainna, -profile:v baselinejeśli tak jest).

  • Jeśli wejście audio AAC jest już wtedy zmienić -c:a aacaby -c:a copyuniknąć niepotrzebnego ponownego kodowania.

  • Czas kodowania będzie dłuższy, a rozmiar pliku większy niż powyższe polecenia YouTube.

  • Aby uzyskać więcej informacji, zobacz FFmpeg Wiki: H.264 .

Llogan
źródło
Czy możesz podać wiersz kodu, aby utworzyć plik a.jpg + a.mp3 = a.mp4 w rozdzielczości 1280 * 720 z najniższą liczbą klatek na sekundę dozwoloną przez YouTube? Ponieważ jest tylko jedno zadanie, czy muszę usunąć „-opętnięcie 1”? Z góry dziękuję.
SIDU
@SIDU Istniejące polecenie wykonuje to, o co prosisz (inne niż wypisywanie MKV zamiast MP4), ale nie wiem, jaka jest najniższa częstotliwość klatek obsługiwana przez YouTube. Musisz po prostu eksperymentować. Dlaczego potrzebujesz MP4, gdy przesyłasz tylko na YouTube?
llogan
Próbowałem, ale mówi:Unrecognized option 'preset'. Error splitting the argument list: Option not found
NineCattoRules
@NineCattoRules Trudno powiedzieć bez dodatkowych informacji. Użyj witryny pastebin, aby wyświetlić pełne ffmpegpolecenie i pełne dane wyjściowe konsoli z polecenia, a następnie podaj link w komentarzu.
llogan
Dzięki, ponownie zainstalowałem FFMPEG przy użyciu repozytorium mc3man i teraz działa dobrze!
NineCattoRules
3

Jedynie informacje, które podałeś, są tym, co mogę wymyślić.

Chodźmy na kawałki:

Ponieważ do wideo dodano tylko jeden obraz. Zastanawiam się, czy istnieje sposób na zmniejszenie rozmiaru wideo, np. Wymuszanie szybkości transmisji / sekundę = 1 zamiast 28?

Ponieważ jest to nieruchomy obraz, nie trzeba go zmieniać. po prostu nie ruszaj się.

Mówisz o klatkach na sekundę (fps), a nie bitrate. I masz rację w koncepcji. Beign tylko jedno zdjęcie 1 fps nie byłoby problemem.

Czy to rozsądny rozmiar dla MP4? Czy rozmiar obrazu ma duże znaczenie?

W tym przypadku rozmiar obrazu nie miałby znaczącej wagi, ponieważ mamy do czynienia tylko z jednym zdjęciem. Jeśli był to film wysokiej jakości, to jest inny problem.

Czy powinienem zmienić rozmiar jpg na 1080 * 720 i wprowadzić dodatkowe ustawienia w ffmpeg, aby wyświetlać jako 720p (jakie jest wtedy ustawienie ffmpeg :)?

Rozdzielczość, o której mówisz, to 1280x720.

Nie widzę sensu w -loop 1opcji tutaj, to tylko spowolni proces. Czy użyłeś, -shortestponieważ plik ma więcej niż 1 strumień wejściowy? Jeśli nie, to nie ma powodu, aby z niego korzystać. Ponieważ używałeś -acodec copy, będę musiał założyć, że nie chcesz go ponownie kodować.

W przypadku wyjścia 720p 1 kl./s bez ponownego kodowania i bez dotykania szybkości transmisji:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 output.mp4

Zaznacz przypadek, że ma więcej niż jeden strumień wejściowy i chcesz, aby ffmpeg zakończył kodowanie w najkrótszym strumieniu:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 -shortest output.mp4

Teraz, jeśli musisz zmienić bitrate (powiedzmy 1024k jako przykład);

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -b:v 1024k -bufsize 1024k -s 1280x720 output.mp4

Zobacz: Ogranicz wyjściową przepływność

-c: kopia = Skopiuj wejściowy strumień audio, abyśmy nie kodowali ponownie.

-b: v = Szybkość transmisji określona jako (nie do końca) stała.

-bufsize = Jest to przedział, w którym obliczana jest średnia przepływność. Oznacza to obraz o najniższej jakości stratności, ale dokładniejszy przepływność zgodnie z parametrami -b: v .

-s = Rzeczywisty rozmiar wyjścia wideo.

-framerate = Liczba klatek na sekundę, którą chcemy, aby dane wyjściowe wykorzystywały.

Pamiętaj, że jeśli nadal chcesz mieć mniejszy rozmiar wideo, będziesz musiał poświęcić jakość, aby to osiągnąć. Inne sposoby na to polegają na ponownym kodowaniu z kompresją stratną.

Z tego, co mówisz, informacje, które podajesz i co próbujesz zrobić, wydaje mi się, że Twoim celem jest osadzenie okładki albumu w formacie mp3. Jeśli taki jest twój cel, lepiej spełni twoje wymagania:

ffmpeg -i input.mp3 -i cover.jpg -map_metadata 0 -map 0 -map 1 output.mp3

-map_metadata = Specyfikator metadanych ffmpeg do pliku wyjściowego z infile. W tym przypadku ( zero ) globalne metadane.

-mapa 0 = Strumień wejściowy 1 (audio).

-mapa 1 = Strumień wejściowy 2 (obraz).

Jeśli nic nie odpowiada Twoim żądaniom, podaj więcej informacji.

Fenrir
źródło
Zastanów się nad użyciem -frameratejako opcji wprowadzania i usunięciem danych wyjściowych -r: w przeciwnym razie zostanie użyta domyślna liczba klatek na sekundę wynosząca 25, a następnie ffmpegzostaną odrzucone klatki w celu osiągnięcia -r 1. Jeśli tylko zadeklarujesz wejściową liczbę klatek na sekundę, wówczas dane wyjściowe będą używać tej samej częstotliwości klatek.
llogan
Dzięki. Nie wiedziałem tego. Edytowane w celu odzwierciedlenia sugerowanych zmian.
Fenrir
Dzięki za samouczek. Moja linia kodu origianl ffmpeg to kopia-wklej z wyszukiwarki Google, której nie mam pojęcia, co jest.
SIDU