У меня есть 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
*, а не масштабировать его?
Спасибо за любую помощь заранее!
* хотя, если тот же результат может быть достигнут с другим энкодером, это тоже хорошо!