Jak ustawić poziom profilu h.264 za pomocą ffmpeg?

16

Mam film (m4v / h.264 / AAC), który dobrze gra na moim komputerze Mac, ale niedawno odkryłem, że nie będzie on odtwarzany na moim Apple TV3. Po przejrzeniu właściwości tego pliku filmowego widzę, że ma on profil [email protected], ale Apple TV3 obsługuje tylko [email protected]. Myślę, że jedyną właściwością, która powoduje niezgodność tego wideo, jest maksymalna przepływność wideo, wszystkie inne właściwości wyglądają tak, jakby były obsługiwane w [email protected].

Jak mogę użyć ffmpeg, aby obniżyć wersję tego filmu do [email protected]?

Czy też muszę zamiast tego zmienić rzeczywistą właściwość (maksymalna przepływność), która sprawia, że ​​ten film 4.1 zamiast 4.0? Martwię się, że jeśli po prostu zmienię szybkość transmisji, mimo że plik byłby zgodny z [email protected], nadal byłby „oznaczony” jako [email protected], a zatem nadal nie byłby odtwarzany na moim Apple TV3.

Sam
źródło

Odpowiedzi:

22

Podczas kodowania za pomocą libx264możesz ustawić profil H.264 i poziom za pomocą:

  • -profile:v- jeden z high, mainlub baseline(i inne, ale tutaj nie ma to znaczenia)
  • -level:v- jak określono w załączniku A do normy H.264, np 4.0.

Na przykład:

ffmpeg -i input.mp4 -c:v libx264 -profile:v high -level:v 4.0 -c:a copy output.mp4

Właśnie skopiowaliśmy strumień audio, ponieważ nie będzie to miało wpływu.

Dane wyjściowe będą miały poprawny profil i poziom ustawiony w swoich metadanych. Możesz to sprawdzić podczas kodowania, gdy x264mówi coś takiego:

[libx264 @ 0x7fb26103a000] profile High, level 4.0

MediaInfo może również pomóc w analizie szczegółów kontenera i kodeka.

Oczywiście ponowne kodowanie wideo do pewnego stopnia obniży jego jakość, biorąc pod uwagę, że ponownie stosujesz konwersję stratną. Spróbuj ustawić -crfopcję wpływania na stały parametr jakości. Wartość domyślna to 23, a wartości od 18 do 28 są uważane za zdrowe. Niższa oznacza lepszą jakość. Jeśli twój sygnał wejściowy ma szybkość bitów do 65 000 kBit / s, są szanse, że nadal będzie wyglądał całkiem dobrze po konwersji.

slhck
źródło
1
To działało dobrze. Niestety stracił część metadanych, ale rzeczywiste wideo nie miało zauważalnej zmiany jakości. Czy w wyniku zainteresowania następujące polecenie osiągnęłoby to samo? ffmpeg -i input.mp4 -vcodec x264 -vprofile high -vlevel 4.0 -acodec copy output.mp4
Sam
Tak, dostępne -vopcje to pseudonimy :v. Jakie metadane straciłeś?
slhck 13.03.13
Myślę, że to mogła być tylko grafika, która zaginęła. Nie wiem, czy jest to technicznie uważane za metadane ... Czy kompozycja rzeczywiście zawiera się w pliku? Nie sprawdziłem wszystkiego innego, zanim ponownie dodałem do tego całość.
Sam
Mam teraz inny plik z podobnym problemem. Jest to zły poziom profilu, ale reszta specyfikacji wydaje się być zgodna z moim wymaganym poziomem (4.0). Jeśli użyję poleceń podanych powyżej, czy dane pozostaną nietknięte, chyba że będą niezgodne z wprowadzonym poziomem profilu? Zasadniczo nie chcę, aby ffmpeg dotykał danych innych niż znacznik informujący o profilu i poziomie. Czy to możliwe, czy zamierza ustawić wszystkie wartości (azotan, ilość klatek na sekundę itp.) Na ustawione wartości?
Sam
2
Właśnie natknąłem się na sposób, aby to osiągnąć. Po wybraniu strumienia wideo Subler ma opcję zmiany profilu i poziomu, aby był zgodny z niektórymi urządzeniami. Mówi ci, aby upewnić się, że wideo jest kompatybilne z ustawionym profilem, więc nie sądzę, że dokonuje żadnego ponownego kodowania, wystarczy zmienić metadane.
Sam
1

W odniesieniu do komentarza wypróbuj to polecenie:

ffmpeg -i input.mp4 -map 1 -c:v libx264 -profile:v high -level:v 4.0 -c:a copy \
# copies all global metadata from input.mp4 to output.mp4
-map_metadata 0 \
# copies video stream metadata from input.mp4 to output.mp4
-map_metadata:s:v 0:s:v \
# copies audio stream metadata from input.mp4 to output.mp4
-map_metadata:s:a 0:s:a \
output.mp4

Twoje zdrowie

Riccardo Volpe
źródło