ffmpeg scale/forcing 修复了视频分辨率问题

ffmpeg scale/forcing fixed video resolution issue

我尝试确保 video comes outresolution1920 x1080, 如果不是编码must force this resolution。 我需要它来从标准分辨率 (HD) 的视频输入创建精细的适配集。

Im unable to get always this resolution, for example with a movie of 1920 x 1040 i get 1993 x 1080

,在我的ffmpeg命令行下面:

ffmpeg -y -i $name -i logo1080.png -c:a aac -b:a 256k -ar 48000 -ac 2 -async 1 -c:v libx264 -x264opts keyint=$GOP:min-keyint=$GOP:no-scenecut -bf 0 -r $FPSC -b:v 2400k -maxrate 2400k -bufsize 1200k -profile:v main -t $FDUR -filter_complex "[0:v][1:v]overlay=main_w-overlay_w-10:10,scale=1920:1080" format1080.mp4

我尝试了 ffmpeg scale 页面告诉的每一种可能性,但不知道如何修复它。 我想我需要一些帮助, 谢谢, 马西莫

谢谢大家的不负责任,我想会有一点点错误,但我不明白在哪里,我尽量把所有步骤都带上!

下面 bash 我也在 Whosebug 用户的帮助下写作:

#!/bin/bash
# ENCODING FOR MPEG DASH

echo "ENCODE DASH-READY PROCESS"

echo -n "Insert input file name (es: input.mp4) and press [ENTER]: "
read name

DUR="$(ffmpeg -i $name 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,// | sed 's@\..*@@g' | awk '{ split(, A, ":"); split(A[3], B, "."); print 3600*A[1] + 60*A[2] + B[1] }')"

FPS="$(ffmpeg -i $name 2>&1 | sed -n "s/.*, \(.*\) fp.*//p")"
FPSC=$( echo "($FPS+0.5)/1" | bc )

eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width $name)
size=${streams_stream_0_height}

GOP="$((FPSC*2))"
DURM="$((DUR%2))"
FDUR="$(($DUR-$DURM))"
# :no-open-gop=1:crf=16
# -c:a copy 
# -vf "scale=-1:1080”


ffmpeg -y -i $name -i logo.png -c:a aac -b:a 384k -ar 48000 -ac 2 -async 1 -c:v libx264 -x264opts keyint=$GOP:min-keyint=$GOP:no-scenecut -bf 0 -s hd1080 -r $FPSC -b:v 4800k -maxrate 4800k -bufsize 3000k -profile:v main -t $FDUR -filter_complex "[0:v][1:v]overlay=main_w-overlay_w-10:10" format-1080.mp4

ffmpeg -y -i format-1080.mp4 -c:a aac -b:a 128k -ar 48000 -ac 2 -async 1 -c:v libx264 -x264opts keyint=$GOP:min-keyint=$GOP:no-scenecut -bf 0 -s 640x360 -r $FPSC -b:v 800k -maxrate 800k -bufsize 500k -profile:v main -t $FDUR format-360.mp4


#clear
echo duration in seconds $FDUR 
echo fps $FPSC 
echo height resolution $size 
echo I-frames GOP $GOP
#MP4Box -info TRACK_ID format.mp4 2>&1 | grep GOP
echo "format-1080.mp4 ready"
echo "format-360.mp4 ready"
echo "ENCODE COMPLETED"

它准备了两个表示,第二个是从第一个创建的。 正如我所说,我希望这个脚本能够处理更多类型的视频:如果输入视频没有所需的规格(例如:gop,分辨率 HD 1920 x 1080),编码必须强制它们从中生成另一个适应集高清版,这是为了避免非传统分辨率,如影院范围或所有不是 1920 x 1080 的分辨率,以生成高清版的精细小版本。

现在事实变得不明朗了: 如果我使用 ffmpeg -i format-1080.mp4 我知道分辨率是 1920 x 1080 但是如果我检查文件信息(请注意我现在尝试 osx)它说 1993 x 1080,并且当我尝试 dashify 时说 MP4Box 是一样的:

[DASH] Files have non-proportional track layouts (1993x1080 vs 664x360) but sample size and aspect ratio match, assuming precision issue

我知道如果第一个视频输入是 1920 x 1080,第二个是 640 x 360,一切正常。

我的ffmpeg版本是3.4.1 实验原视频为:

ffmpeg version 3.4.1 Copyright (c) 2000-2017 the FFmpeg developers
  built with Apple LLVM version 9.0.0 (clang-900.0.39.2)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/3.4.1 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-gpl --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --enable-videotoolbox --disable-lzma
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libavresample   3.  7.  0 /  3.  7.  0
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'total.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isomavc1
    creation_time   : 2012-08-10T11:02:57.000000Z
  Duration: 01:53:31.08, start: 0.000000, bitrate: 2211 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1040 [SAR 1:1 DAR 24:13], 2111 kb/s, 24 fps, 24 tbr, 96 tbn, 48 tbc (default)
    Metadata:
      creation_time   : 2012-08-10T11:02:58.000000Z
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 95 kb/s (default)
    Metadata:
      creation_time   : 2012-08-10T11:13:14.000000Z
      handler_name    : GPAC ISO Audio Handler

在上面你可以清楚地看到原始分辨率是 1920 x 1040。 当我尝试添加更多没有原始分辨率比例的区域时似乎是个问题,似乎只有当视频必须变得比原始视频更小时,比例校正才能正常工作。 一些想法? 谢谢! 马西莫

MP4box 似乎考虑了 SAR 校正后的尺寸,即它认为帧尺寸为 iw*sar x ih。 ffmpeg 的比例过滤器调整输出的 SAR 以保持输入的 DAR。在这种情况下,1920/1040 = 1920 x newSAR/1080,所以 1920 x new SAR == 1993.

您可以通过在缩放后将 SAR 设置为 1 来回避这个问题。

-filter_complex "[0:v][1:v]overlay=main_w-overlay_w-10:10,scale=1920:1080,setsar=1"