2

I'm trying to change the aspect ratio of video, cause it's being showed in a wrong way (it sould be 16:9 but shows 3:4). I've tried a lot of things, and none worked. E.g. I've tried to set SAR, but it changes DAR, so the aspect ratio stays the same. Here's an example:

ffmpeg -y -i rtmp://localhost/in/air-hdmi -vf "setsar=sar=16/9" -f flv rtmp://localhost/in/ngoraltestffmpeg 


    ffmpeg version N-80388-gfd1d84b Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04.3)
  configuration: --prefix=/home/anastasia/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/anastasia/ffmpeg_build/include --extra-ldflags=-L/home/anastasia/ffmpeg_build/lib --bindir=/home/anastasia/bin --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree
  libavutil      55. 24.100 / 55. 24.100
  libavcodec     57. 46.100 / 57. 46.100
  libavformat    57. 38.101 / 57. 38.101
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 46.101 /  6. 46.101
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  1.100 /  2.  1.100
  libpostproc    54.  0.100 / 54.  0.100

[flv @ 0x38143c0] audio stream discovered after head already parsed
[aac @ 0x3818f20] element type mismatch 1 != 0
[flv @ 0x38143c0] video stream discovered after head already parsed
Input #0, flv, from 'rtmp://localhost/in/air-hdmi':
  Metadata:
    Server          : NGINX RTMP (github.com/arut/nginx-rtmp-module)
    displayWidth    : 720
    displayHeight   : 576
    fps             : 0
    profile         : 
    level           : 
  Duration: 00:00:00.00, start: 181748.084000, bitrate: N/A
    Stream #0:0: Audio: aac (HE-AAC), 44100 Hz, stereo, fltp
    Stream #0:1: Video: h264 (High), yuv420p, 720x576, 25 fps, 25 tbr, 1k tbn, 50 tbc
[flv @ 0x39bf5a0] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
    Last message repeated 1 times
Output #0, flv, to 'rtmp://localhost/in/ngoraltest':
  Metadata:
    Server          : NGINX RTMP (github.com/arut/nginx-rtmp-module)
    displayWidth    : 720
    displayHeight   : 576
    fps             : 0
    profile         : 
    level           : 
    encoder         : Lavf57.38.101
    Stream #0:0: Video: flv1 (flv) ([2][0][0][0] / 0x0002), yuv420p, 720x576 [SAR 16:9 DAR 20:9], q=2-31, 200 kb/s, 25 fps, 1k tbn, 25 tbc
    Metadata:
      encoder         : Lavc57.46.100 flv
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
    Stream #0:1: Audio: mp3 (libmp3lame) ([2][0][0][0] / 0x0002), 44100 Hz, stereo, fltp
    Metadata:
      encoder         : Lavc57.46.100 libmp3lame
Stream mapping:
  Stream #0:1 -> #0:0 (h264 (native) -> flv1 (flv))
  Stream #0:0 -> #0:1 (aac (native) -> mp3 (libmp3lame))
Press [q] to stop, [?] for help
[aac @ 0x3a37000] element type mismatch 1 != 0
    Last message repeated 7 times
[flv @ 0x39bf5a0] Failed to update header with correct duration.ate= 942.7kbits/s speed=2.37x    
[flv @ 0x39bf5a0] Failed to update header with correct filesize.
frame=  112 fps= 48 q=31.0 Lsize=     633kB time=00:00:05.18 bitrate= 999.9kbits/s speed=2.23x    
video:546kB audio:82kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.846813%
Exiting normally, received signal 2.

Using setdar=16/9 do not succeeds: it changes PAR, so the result is the same:

Input #0, flv, from 'rtmp://localhost/in/air-hdmi':
  Metadata:
    Server          : NGINX RTMP (github.com/arut/nginx-rtmp-module)
    displayWidth    : 720
    displayHeight   : 576
    fps             : 0
    profile         : 
    level           : 
  Duration: 00:00:00.00, start: 287464.746000, bitrate: N/A
    Stream #0:0: Audio: aac (HE-AAC), 44100 Hz, stereo, fltp
    Stream #0:1: Video: h264 (High), yuv420p, 720x576, 25 fps, 25 tbr, 1k tbn, 50 tbc
[flv @ 0x3a5ea20] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
    Last message repeated 1 times
Output #0, flv, to 'rtmp://localhost/in/ngoraltest':
  Metadata:
    Server          : NGINX RTMP (github.com/arut/nginx-rtmp-module)
    displayWidth    : 720
    displayHeight   : 576
    fps             : 0
    profile         : 
    level           : 
    encoder         : Lavf57.38.101
    Stream #0:0: Video: flv1 (flv) ([2][0][0][0] / 0x0002), yuv420p, 720x576 [SAR 64:45 DAR 16:9], q=2-31, 200 kb/s, 25 fps, 1k tbn, 25 tbc
    Metadata:
      encoder         : Lavc57.46.100 flv
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
    Stream #0:1: Audio: mp3 (libmp3lame) ([2][0][0][0] / 0x0002), 44100 Hz, stereo, fltp
    Metadata:
      encoder         : Lavc57.46.100 libmp3lame
Stream mapping:
  Stream #0:1 -> #0:0 (h264 (native) -> flv1 (flv))
  Stream #0:0 -> #0:1 (aac (native) -> mp3 (libmp3lame))
Press [q] to stop, [?] for help

(When use setsar, the params are 720x576 [SAR 16:9 DAR 20:9], when setdar -- 720x576 [SAR 64:45 DAR 16:9])

I've also tried to apply scale=720:-1 and -aspect 16:9 and all left the same.

BUT! Wnen I write ffplay -vf setsar=16/9 rtmp://localhost/in/ngoraltest it shows perfectly what I need. What could be thae problem and hoe to solve it?

P.S. I'm little bit confused that there's no onformation about SAR and DAR of input signal, but I can do totally nothing with it.

3
  • You're using the encoder flv1. I doubt you want that.
    – llogan
    Commented Nov 21, 2016 at 20:29
  • @LordNeckbeard Whatshoul I use? And HOW? :)
    – Ngoral
    Commented Nov 21, 2016 at 22:39
  • Add -c:v libx264 as an output option for H.264 video.
    – llogan
    Commented Nov 21, 2016 at 23:40

3 Answers 3

6
ffmpeg -i infile -aspect 16:9 -c copy outputfile

From the documentation:

Set the video display aspect ratio. If -aspect is used together when stream copying, it will affect the aspect ratio stored at container level, but not the aspect ratio stored in encoded frames, if it exists.

From what I know. There is this problem with video media when the DAR numbers get high. I guess the media is so tightly wound up and it will not concat to other media with the same aspect. The only way I can see around this is converting it to raw format and recompressing it. I encountered this problem when I tried to concat or splice video clips together. Numbers that do not match up the DAR in different files give an error. I was forced to use windows movie maker to attach the media manually.

4
  • If you read my question, you could notice I've tried it. Also -c:v copy throws an error if used with -aspect cause aspect obviously changes codec
    – Ngoral
    Commented Nov 21, 2016 at 7:23
  • @Ngoral -aspect does work with -c:v copy for some container formats, but I'm not familiar enough with FLV and RTMP to know offhand if it will work and I didn't investigate or test. However, you did not provide the actual error, and you omitted the ffmpeg configure and version info which is important to include. How are we to know if you are not using an ancient ffmpeg?
    – llogan
    Commented Nov 21, 2016 at 20:28
  • @LordNeckbeard Yes, sorry, everything has mixed in my mind, it works with c:v copy. Anyway, that does not help. I also updated logs, so that you can see version and all dependencies
    – Ngoral
    Commented Nov 21, 2016 at 22:39
  • This answer is fantastic. It does not re-encode anything, it just changes the metadata for SAR/DAR, so it finishes in a few seconds.
    – wisbucky
    Commented Apr 14, 2022 at 5:55
3

You need to use

ffmpeg -y -i rtmp://localhost/in/air-hdmi -vf "setdar=16/9" -f flv rtmp://localhost/in/ngoraltestffmpeg

setsar is the aspect ratio of a sample i.e. one pixel. setdar is for the video. Of course, what setdar does is change the SAR, taking into account the dimensions of the video, so that the display ratio is obtained. DAR = Width x SAR / height

2
  • I thought I actually need to sat to encoder/decoder that my pixels should be some other form. Anyway, that does not work :(
    – Ngoral
    Commented Nov 21, 2016 at 22:35
  • According to the console output you pasted, the DAR of the output is 16:9, so the values are correct. Is your video already letterboxed? Paste a screenshot from the original video. You can also skip the ratio flags by scaling directly. ffmpeg -y -i rtmp://... -vf "scale=1024:576,setsar=1" -f flv rtmp://...
    – Gyan
    Commented Nov 22, 2016 at 5:30
1

So, based on everything here, I had the same issue and tried something super simple that worked: (in my case, it was displaying as 4:3 but I needed it to display as 16:9)

Note, however, that I was informed by the output of my first failed try, it told me this:

Stream #0:0: Video ...(other stuff)... 640x480 [SAR 1:1 DAR 4:3], ... (other stuff)...

So I figured I just needed to change DAR 4:3, and so I just ran this:

ffmpeg -i "input.avi" -vf setdar=16:9 -c:a copy "output.mp4"

and it worked like a charm.

1
  • 1. This will re-encode the video. 2. This didn't work for me. It changed my video from 1440x1080, SAR 1:1, DAR 4:3 to 1440x1080, SAR 27:4, DAR 9:1, which was totally wrong. I would recommend others to first try the answer -aspect 16:9 -c copy, which is lossless and fast.
    – wisbucky
    Commented Apr 14, 2022 at 6:01

Not the answer you're looking for? Browse other questions tagged or ask your own question.