2

У меня есть MP4, который содержит поток H264/AVC, который содержит несколько разрешений.

Ниже приведен вывод mediainfo для этого файла:

General
Complete name                            : known.mp4
Format                                   : MPEG-4
Format profile                           : Base Media
Codec ID                                 : isom
File size                                : 661 KiB
Duration                                 : 15s 960ms
Overall bit rate                         : 340 Kbps
Writing application                      : Lavf54.49.102

Video
ID                                       : 1
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : Baseline@L2.0
Format settings, CABAC                   : No
Format settings, ReFrames                : 1 frame
Codec ID                                 : avc1
Codec ID/Info                            : Advanced Video Coding
Duration                                 : 15s 960ms
Bit rate                                 : 338 Kbps
Width                                    : 176 pixels
Original width                           : 352 pixels
Height                                   : 144 pixels
Original height                          : 288 pixels
Display aspect ratio                     : 1.222
Frame rate mode                          : Constant
Frame rate                               : 25.000 fps
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Progressive
Bits/(Pixel*Frame)                       : 0.534
Stream size                              : 659 KiB (100%)

После некоторых исследований значение Lavf54.49.102 указывает на то, что ffmpeg использовался для кодирования этого файла.

Ниже приведен вывод ffplay для этого файла:

ffplay known.mp4 
ffplay version 2.4.3 Copyright (c) 2003-2014 the FFmpeg developers
  built on Nov  9 2014 17:21:35 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
  configuration: --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-x11grab --enable-libpulse --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid
  libavutil      54.  7.100 / 54.  7.100
  libavcodec     56.  1.100 / 56.  1.100
  libavformat    56.  4.101 / 56.  4.101
  libavdevice    56.  0.100 / 56.  0.100
  libavfilter     5.  1.100 /  5.  1.100
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  0.100 /  3.  0.100
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  0.100 / 53.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'known.mp4':=    0B f=0/0   
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf54.49.102
  Duration: 00:00:15.96, start: 0.000000, bitrate: 339 kb/s
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 176x144, 338 kb/s, 25 fps, 25 tbr, 1200k tbn, 2400k tbc (default)
    Metadata:
      handler_name    : VideoHandler
[h264 @ 0x7f756800b540] Reinit context to 352x288, pix_fmt: yuv420p 

Обратите внимание на последнюю строку [h264 @ 0x7f756800b540] Reinit context to 352x288, pix_fmt: yuv420p ; в этот момент ffplay меняет размер в соответствии с этим новым разрешением.

В настоящее время я пытаюсь воспроизвести этот эффект "многократного разрешения", сначала на том же видео, декодируя и затем перекодируя его, и как только это сработает, я планирую закодировать другое видео таким же образом, чтобы (надеюсь) добиться того же. Как только это сработает, я постараюсь добиться того же с другими кодеками, которые поддерживают это.

До сих пор мои усилия, даже перекодирование того же видео с использованием ffmpeg , привели к получению видео, в котором одно разрешение просто масштабируется до такого же размера, что и другое, вместо фактического кодирования потока с двумя разными разрешениями.

Я перепробовал все, что только мог придумать, начиная от простого повторного кодирования и кончая передачей выходных данных ffmpeg обратно в ffmpeg , форсированием профиля до базового уровня, преобразованием потока в mpg и так далее. Кажется, ничего не работает.

У меня вопрос, как я могу сохранить изменение разрешения в ffmpeg *, а не масштабировать его?

Спасибо за любую помощь заранее!


* хотя, если тот же результат может быть достигнут с другим энкодером, это тоже хорошо!

1 ответ1

1

Ответ был не использовать ffmpeg вообще. Оказывается, потоки H264/AVC поддерживают конкатенацию, и поэтому просто работает два отдельных потока с различным разрешением и используется cat .

Итак, с двумя потоками в разных разрешениях ...

cat stream_a.h264 stream_b.h264 >> stream_c.h264

Тогда оберните это в любом контейнере, который Вы хотите.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .