Правильное соотношение сторон без перекодирования видеофайла

18

У меня есть видеопоток со следующими свойствами:

Stream #0:0: Video: mpeg4 (Advanced Simple Profile) (XVID / 0x44495658), yuv420p, 720x416 [SAR 1:1 DAR 45:26], 1908 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc

Когда я запускаю его в VLC, мне нужно нажать «A», чтобы изменить соотношение сторон на «4: 3», чтобы видео показывалось с правильным соотношением сторон.

Глядя на факты о видео, является ли ошибкой то, что а) фактическое видео было неправильно растянуто в пиксельных данных, или б) есть просто какое-то значение метаданных, которое было неправильно установлено?

Если первое, я знаю, я могу перекодировать видео и изменить ширину и высоту. Но если последнее, то какую команду ffmpeg запустить для исправления метаданных без перекодирования самого видео?

forthrin
источник

Ответы:

36

Существует разница между примерным соотношением сторон (SAR) и отображаемым соотношением сторон (DAR). Если вы хотите изменить отображение видео в формате 4: 3, вам нужно либо изменить фактические пиксели в изображении (путем масштабирования пикселей и изменения SAR), либо установить флаг метаданных, который на уровне контейнера сообщает внешнему медиаплееры, чтобы растянуть изображение до желаемого DAR.

Вы не сможете масштабировать пиксели и изменять SAR без применения видеофильтра. Если вы выберете этот метод, вам необходимо будет перекодировать файл - поскольку вы не можете «скопировать поток» видеопотока при применении видеофильтра.

Чтобы масштабировать изображение и изменить SAR (во время транскодирования), попробуйте:

ffmpeg -i <INPUT_FILE> -vf scale=720:540 -c:v <Video_Codec> <OUTPUT_FILE>

С другой стороны, если вы просто хотите изменить флаг метаданных и настроить DAR, вы сможете скопировать видео в потоковом режиме. Для этого попробуйте:

ffmpeg -i <INPUT_FILE> -aspect 720:540 -c copy [OUTPUT_FILE]
occvtech
источник
Превосходно! Изменение аспекта сработало сразу!
forthrin
1
Вы не можете использовать -c copyи масштабировать одновременно; однако вы можете использовать -aspectдля изменения соотношения сторон на уровне контейнера (но не на уровне потока).
llogan
@LordNeckbeard, использование -aspectработает для воспроизведения в ffplay, но не в WMP или MPC-HC. Он добавляет дополнительный элемент SAR / DAR к Stream #…информационной строке, FFmpeg/probe/playно, похоже, не является решением для общего воспроизведения. Растягивание видео с помощью окна кажется самым простым решением для воспроизведения MPC-HC.
Луми
у меня не работает MPEG2 без перекодирования
Михаил V
Я не знаю, почему это не сработало для меня. Он просто выводит одно и то же видео!
Тина Дж
4

Ответ Дельгадо верен, что MP4Box может сделать это, но -parопция не работает так, как описано. С -outпараметром (чтобы не мешать вашему исходному файлу):

mp4box source.mp4 -out target.mp4 -par stream-number=width:height

Когда вы используете -par stream-number=width:height, вы определяете соотношение сторон пикселя, то есть результат деления соотношения сторон устройства на соотношение сторон хранилища. (Эквивалентно, вы описываете соотношение сторон исходного пикселя.) Например, предположим, что у вас есть источник DVD с разрешением 720 × 480 и правильное соотношение сторон экрана 4: 3. Для этого случая вам нужно:

mp4box source.mp4 -out target.mp4 -par 1=8:9

потому что (4/3) / (720/480) = 8/9.

Если источник представляет истинные пиксели SD NTSC (в этом случае предполагается, что только центральные 704 × 480 пикселей должны отображаться на экран 4 × 3 с 8-пиксельным пересканированием по обе стороны), правильной командой будет:

mp4box source.mp4 -out target.mp4 -par 1=10:11

потому что (4/3) / (704/480) = 10/11 - в точности соотношение сторон эталонного пикселя для видео NTSC стандартной четкости.

Для случая, приведенного в вопросе, если это действительно 4: 3, это дает очень странное соотношение пикселей: (4/3) / (720/416) = 104/135. Его ширина 720, что предполагает источник DVD; это видео с частотой 25 кадров в секунду, предполагающее PAL, но PAR работает до 1, предлагая NTSC. Полагаю, это может быть 4: 5 (очень близко к 104: 135), но я не знаю ничего, что могло бы дать такое соотношение пикселей; возможно, попробуйте сначала, а затем попробуйте 3: 4, если он все еще выглядит слишком растянутым по горизонтали. Если вы уверены, что это точно 4: 3, просто используйте 104: 135.

Coises
источник
3

ffmpeg не может изменить параметры видеопотока без перекодирования, MP4Box (часть gpac ) и mkvmerge могут. В случае одного видеопотока и реального / правильного соотношения сторон 4: 3, вы можете попробовать:

MP4Box -par 1=3:4 VideoFile.mp4

    "-par" : PixelAspectRatio (adjusts DAR + SAR with respect to the video resolution)
    "1"=   : stream number
    "3:4"  : aspect ratio (lower number 1st!)
    Changes are directly applied to "VideoFile.mp4", no copy

Для проверки до и после: ffmpeg -i VideoFile.mp4

Delgado
источник
0

Изменение SAR без перекодировки также работает с ffmpegна .mp4использование в h264_metadataкачестве Gyan указывало здесь :

ffmpeg -i in.mp4 -c copy -bsf:v "h264_metadata=sample_aspect_ratio=4/3" out.mp4
drake7
источник
Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить сюда основные части ответа и предоставить ссылку для справки.
МММ