Opened 9 years ago
Last modified 9 years ago
#6358 open enhancement
ffmpeg requires constant output dimensions
| Reported by: | 01sas | Owned by: | |
|---|---|---|---|
| Priority: | wish | Component: | ffmpeg |
| Version: | git-master | Keywords: | |
| Cc: | Blocked By: | ||
| Blocking: | Reproduced by developer: | yes | |
| Analyzed by developer: | no |
Description
Summary of the bug:
I have a video recorded from TV (DVB) and this video has a different SAR other the time. Like when advertisement or some modern TV show is shown then SAR is 64:45 which gives image with 16:9 aspect ratio but when some old TV show is shown then SAR is 16:15 which gives image with 4:3 aspect ratio. I want to convert this video to a sequence of images one per second and I want image to have a valid resolution according to SAR with correct aspect ratio.
The first problem which I face is that ffmpeg does not take SAR into account when generate images. I solve this problem using video filter, like this: -vf "scale=iw:ih/sar:eval=frame".
But after that I face a problem which I don't know how to solve: ffmpeg generate images with always the same resolution and does not change it in respect to changed scale. In my case it simply crop image when aspect ratio is 4:3. In logs it is visible that scaler calculate resolution correctly but output images always has the same resolution as for first image which is a problem.
How to reproduce:
% ffmpeg -i test.ts -vf "scale=iw:ih/sar:eval=frame,fps=1" -qscale:v 6 "frames/out%03d.jpg"
ffmpeg version 3.2.4-1~16.04.york1 Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 5.4.1 (Ubuntu 5.4.1-5ubuntu2~16.04.york1) 20170210
configuration: --prefix=/usr --extra-version='1~16.04.york1' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libebur128 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
libavutil 55. 34.101 / 55. 34.101
libavcodec 57. 64.101 / 57. 64.101
libavformat 57. 56.101 / 57. 56.101
libavdevice 57. 1.100 / 57. 1.100
libavfilter 6. 65.100 / 6. 65.100
libavresample 3. 1. 0 / 3. 1. 0
libswscale 4. 2.100 / 4. 2.100
libswresample 2. 3.100 / 2. 3.100
libpostproc 54. 1.100 / 54. 1.100
Input #0, mpegts, from 'test.ts':
Duration: 00:01:00.14, start: 1.400000, bitrate: 8223 kb/s
Program 1
Metadata:
service_name : Service01
service_provider: FFmpeg
Stream #0:0[0x100]: Video: mpeg2video (Main), 1 reference frame ([2][0][0][0] / 0x0002), yuv420p(tv, top first, left), 720x576 [SAR 64:45 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0:1[0x101](deu): Audio: ac3 ([129][0][0][0] / 0x0081), 48000 Hz, 5.1(side), fltp, 448 kb/s
[Parsed_scale_0 @ 0x55a718d39480] w:iw h:ih/sar flags:'bicubic' interl:0
[Parsed_fps_1 @ 0x55a718d39f20] fps=1/1
[graph 0 input from stream 0:0 @ 0x55a718d39da0] w:720 h:576 pixfmt:yuv420p tb:1/90000 fr:25/1 sar:64/45 sws_param:flags=2
[swscaler @ 0x55a718d3af40] deprecated pixel format used, make sure you did set range correctly
[Parsed_scale_0 @ 0x55a718d39480] w:720 h:576 fmt:yuv420p sar:64/45 -> w:720 h:405 fmt:yuvj420p sar:1/1 flags:0x4
Output #0, image2, to 'out%03d.jpg':
Metadata:
encoder : Lavf57.56.101
Stream #0:0: Video: mjpeg, 1 reference frame, yuvj420p(pc, left), 720x405 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 1 fps, 1 tbn, 1 tbc
Metadata:
encoder : Lavc57.64.101 mjpeg
Side data:
cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
Stream mapping:
Stream #0:0 -> #0:0 (mpeg2video (native) -> mjpeg (native))
Press [q] to stop, [?] for help
[mpegts @ 0x55a718cf04a0] Correcting start time by 178733
[swscaler @ 0x55a718ee4560] deprecated pixel format used, make sure you did set range correctly
[Parsed_scale_0 @ 0x55a718d39480] w:720 h:576 fmt:yuv420p sar:16/15 -> w:720 h:540 fmt:yuvj420p sar:1/1 flags:0x4
No more output streams to write to, finishing.56.00 bitrate=N/A speed= 9.3x
frame= 61 fps=9.7 q=6.0 Lsize=N/A time=00:01:01.00 bitrate=N/A speed= 9.7x
video:1537kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Input file #0 (test.ts):
Input stream #0:0 (video): 1497 packets read (53746648 bytes); 1494 frames decoded;
Input stream #0:1 (audio): 0 packets read (0 bytes);
Total: 1497 packets (53746648 bytes) demuxed
Output file #0 (out%03d.jpg):
Output stream #0:0 (video): 61 frames encoded; 61 packets muxed (1573461 bytes);
Total: 61 packets (1573461 bytes) muxed
[Parsed_fps_1 @ 0x55a718d39f20] 1494 frames in, 61 frames out; 1433 frames dropped, 0 frames duplicated.
Attachments (2)
Change History (6)
by , 9 years ago
| Attachment: | ffmpeg-20170428-184536.log added |
|---|
by , 9 years ago
| Attachment: | test2_cut.ts added |
|---|
comment:1 by , 9 years ago
| Priority: | normal → wish |
|---|---|
| Reproduced by developer: | set |
| Status: | new → open |
| Summary: | Video to images functionality does not take SAR into account → ffmpeg requires constant output dimensions |
| Type: | defect → enhancement |
| Version: | 3.2.4 → git-master |
follow-up: 3 comment:2 by , 9 years ago
To complement the previous comment:
Most images format do not contain provisions to store the aspect ratio, they all more or less implicitly assume square pixels.
comment:3 by , 9 years ago
Replying to Cigaes:
Most images format do not contain provisions to store the aspect ratio
At least jpg, png, tif and dpx do. Targa and j2k allow it, it isn't supported by FFmpeg for these two though.
comment:4 by , 9 years ago
First of all thanks for your answers, guys.
Second: I can confirm that filter chains works fine in this case according to results which I can see.
Third: sorry for misunderstanding I was not talking about setting SAR into saved image, square pixels is just fine. I just want the output image stream to reflect possible change in aspect ratio and image to be stored with correct resolution. For command and test video fragment which I attached to ticket I expect that first two images will be with resolution 720x405 and the rest should be with resolution 720x540.



For future tickets: Please remember to always test current FFmpeg git head.
Even if the output format allows changing dimensions,
ffmpegforces the same dimension for the whole duration of the output video stream (while output aspect ratio change is allowed). I don't think this is related to aspect ratio (although input with changing aspect ratio allows to reproduce the issue, as does input with changing dimenstions). The filter chain works fine as can be tested withffplay.