Как установить уровень профиля h.264 с помощью ffmpeg?

50776
Sam

У меня есть фильм (m4v / h.264 / AAC), который отлично воспроизводится на моем Mac, но недавно я обнаружил, что он не будет воспроизводиться на моем Apple TV3. После просмотра свойств этого файла фильма я вижу, что у него есть профиль High@4.1, но Apple TV3 поддерживает только High@4.0. Я думаю, что единственное свойство, которое делает это видео несовместимым, это максимальная скорость передачи видео, все остальные свойства выглядят так, как будто они поддерживаются в High@4.0.

Как я могу использовать ffmpeg для понижения этого видео до High@4.0?

Или я должен вместо этого изменить фактическое свойство (максимальная скорость передачи), которое делает это видео 4.1 вместо 4.0? Я обеспокоен тем, что если я просто изменю скорость передачи данных, хотя файл будет совместим с High@4.0, он все равно будет «помечен» как High@4.1 и, следовательно, все равно не будет воспроизводиться на моем Apple TV3.

13

2 ответа на вопрос

19
slhck

При кодировании с помощью libx264вы можете установить профиль и уровень H.264 с помощью:

  • -profile:v- один из high, mainили baseline(и другие, но здесь это не имеет значения)
  • -level:v- как определено в Приложении A стандарта H.264, например 4.0.

Например:

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

Здесь мы только что скопировали аудиопоток, поскольку он не будет затронут.

Выходные данные будут иметь правильный профиль и уровень, установленные в его метаданных. Вы можете проверить это во время кодирования, где x264говорится что-то вроде:

[libx264 @ 0x7fb26103a000] profile High, level 4.0 

MediaInfo также может помочь вам проанализировать детали контейнера и кодека.

Конечно, перекодирование видео в некоторой степени ухудшит его качество, учитывая, что вы снова применяете преобразование с потерями. Попробуйте установить -crfпараметр, чтобы влиять на параметр постоянного качества. Значение по умолчанию здесь 23, а значения между 18 и 28 считаются нормальными. Чем ниже, тем лучше качество. Если ваш входной сигнал имеет скорость передачи до 65000 кбит / с, скорее всего, после преобразования он все равно будет выглядеть довольно хорошо.

Это сработало хорошо. К сожалению, некоторые метаданные были утеряны, но качество видео не изменилось. Из интереса, достигла ли следующая команда того же самого? `ffmpeg -i input.mp4 -vcodec x264 -vprofile high -vlevel 4.0 -acodec copy output.mp4` Sam 11 лет назад 1
Да, параметры `-v` являются псевдонимами`: v`. Какие метаданные вы потеряли? slhck 11 лет назад 0
Я думаю, что это может быть просто произведение искусства, которое было потеряно. Я не знаю, технически ли это считается метаданными ... На самом деле художественные работы содержатся в файле? Я не проверял все остальное, прежде чем снова добавил все к нему. Sam 11 лет назад 0
У меня сейчас другой файл с похожей проблемой. Это неправильный уровень профиля, но остальные спецификации кажутся совместимыми с моим требуемым уровнем (4.0). Если я воспользуюсь командами, которые вы дали выше, останутся ли данные нетронутыми, если они не будут несовместимы с введенным уровнем профиля? По сути, я не хочу, чтобы ffmpeg касался каких-либо данных, кроме тега, который говорит, что это за профиль и уровень. Возможно ли это, или он собирается установить все значения (нитрат, частота кадров и т. Д.) На заданные значения? Sam 11 лет назад 0
Если вы используете вышеуказанные команды, он перекодирует видео. Если вы хотите просто изменить информацию об уровне, вам придется изменить поток битов, что не может сделать ни одна из программ, о которых я знаю, если вы не напишите ее самостоятельно. Уровень хранится в виде необработанных байтов в наборе параметров последовательности битового потока (для получения более подробной информации вам необходимо обратиться к стандарту ИСО / МЭК 14496-10, разделы 7.3.2.1 и Приложение А). slhck 11 лет назад 0
Я просто наткнулся на способ добиться этого. На самом деле у Сублера есть возможность при выборе видеопотока изменить профиль и уровень, чтобы сделать его совместимым с определенными устройствами. Он говорит вам, чтобы убедиться, что видео совместимо с профилем, который вы устанавливаете, так что я не думаю, что оно перекодирует, просто нужно изменить метаданные. Sam 11 лет назад 2
О, это очень приятно знать, спасибо @Sam! slhck 11 лет назад 0
Чтобы не потерять метаданные (и, кроме того, не потерять другие дорожки, аудио или субтитры), добавьте `-map 0`. cdlvcdlv 6 лет назад 0
Это хорошо работает для libx264. Как насчет кодера h264_omx? Это не работает (выдает ошибку). Ryan Griggs 6 лет назад 0
@RyanGriggs Кодер OMX должен поддерживать это, не могли бы вы опубликовать новый вопрос и включить полный вывод команды и командной строки? Спасибо slhck 6 лет назад 0
Это была просто старая версия. Обновление до 3.3+ исправляет это. Ryan Griggs 6 лет назад 0
0
Riccardo Volpe

Ссылаясь на ваш комментарий, попробуйте эту команду:

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 

ура

Похожие вопросы