ffmpeg scale/forcing 修复了视频分辨率问题
ffmpeg scale/forcing fixed video resolution issue
我尝试确保 video comes out
的 resolution
为 1920 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"
我尝试确保 video comes out
的 resolution
为 1920 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"