使用 ffmpeg 处理视频而不会降低质量
Manipulate video with ffmpeg without losing quality
我正在使用以下代码使用 ffmpeg 旋转视频:
ffmpeg -i nd750_a0040.MOV -vf "transpose=dir=clock, transpose=dir=clock" out.mkv
生成的文件几乎比输入文件小 10 倍。
我发现 解决了一个相关的问题,并建议将编解码器和比特率传递给 ffmpeg 从以下获得:
bitratev="$(ffmpeg -i "" -f null - |& grep video: | awk -F'[:|kB]' '{print }')"
codecv="$(ffprobe -loglevel error -select_streams v:0 -show_entries stream=codec_name -of default=nk=1:nw=1 "")"
然而,这两个命令对两个文件给出了相同的输出:分别为 2643
和 h264
。
我假设 ffmpeg 将这些值默认保持为相同的输出是否正确?
但是,如果我用 ffmpeg -i
检查文件,我会得到不同的比特率值:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'nd750_a0040.MOV':
Metadata:
major_brand : qt
minor_version : 537331968
compatible_brands: qt niko
creation_time : 2016-06-18 04:28:03
Duration: 00:15:40.74, start: 0.000000, bitrate: 11569 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, smpte170m/bt709/bt470m), 1920x1080, 10029 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
Metadata:
creation_time : 2016-06-18 04:28:03
Stream #0:1(eng): Audio: pcm_s16le (sowt / 0x74776F73), 48000 Hz, 2 channels, s16, 1536 kb/s (default)
Metadata:
creation_time : 2016-06-18 04:28:03
和
Input #0, matroska,webm, from 'out.mkv':
Metadata:
COMPATIBLE_BRANDS: qt niko
MAJOR_BRAND : qt
MINOR_VERSION : 537331968
ENCODER : Lavf56.40.101
Duration: 00:15:40.74, start: 0.000000, bitrate: 1445 kb/s
Stream #0:0(eng): Video: h264 (High), yuvj420p(pc), 1920x1080, SAR 1:1 DAR 16:9, 29.97 fps, 29.97 tbr, 1k tbn, 59.94 tbc (default)
Metadata:
CREATION_TIME : 2016-06-18 04:28:03
LANGUAGE : eng
ENCODER : Lavc56.60.100 libx264
DURATION : 00:15:40.742000000
Stream #0:1(eng): Audio: vorbis, 48000 Hz, stereo, fltp (default)
Metadata:
CREATION_TIME : 2016-06-18 04:28:03
LANGUAGE : eng
ENCODER : Lavc56.60.100 libvorbis
DURATION : 00:15:40.743000000
所以我有几个问题:
- 每个视频的正确比特率是多少?
- 这两个文件之间的所有信息丢失是否都包含在比特率中(或者 ffmpeg 默认情况下是否会更改导致文件大小更小的其他内容 - 如果是,那是什么?)?
- 如何确保除了容器格式和旋转之外没有其他变化?
如果您使用过滤器(例如转置过滤器)处理视频,视频 将被重新编码。
下面的命令将为您提供视频流的比特率(如果可用)。
ffprobe video.mov -select_streams v -show_entries stream=bit_rate -of compact=p=0:nk=1
查看我的回答 here,如果这没有产生值。
您当前的命令也会对音频进行重新编码。您可以跳过它,并指定比特率:
ffmpeg -i nd750_a0040.MOV -vf "transpose=clock,transpose=clock" -b:v 10M -c:a copy out.mkv
x264 编码很智能,因此它只会根据需要使用尽可能多的比特率。
您可以使用 CRF 方法,而不是坚持比特率,它旨在始终保持恒定的质量。 18 是一个很好的数字。越低越好,但视觉上通常不明显。
ffmpeg -i nd750_a0040.MOV -vf "transpose=clock,transpose=clock" -crf 18 -c:a copy out.mkv
当然,如果你的播放器支持的话,你可以只加一个旋转标签,根本不重新编码。
ffmpeg -i nd750_a0040.MOV -c copy -metadata:s:v:0 rotate=180 out.mkv
我正在使用以下代码使用 ffmpeg 旋转视频:
ffmpeg -i nd750_a0040.MOV -vf "transpose=dir=clock, transpose=dir=clock" out.mkv
生成的文件几乎比输入文件小 10 倍。
我发现
bitratev="$(ffmpeg -i "" -f null - |& grep video: | awk -F'[:|kB]' '{print }')"
codecv="$(ffprobe -loglevel error -select_streams v:0 -show_entries stream=codec_name -of default=nk=1:nw=1 "")"
然而,这两个命令对两个文件给出了相同的输出:分别为 2643
和 h264
。
我假设 ffmpeg 将这些值默认保持为相同的输出是否正确?
但是,如果我用 ffmpeg -i
检查文件,我会得到不同的比特率值:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'nd750_a0040.MOV':
Metadata:
major_brand : qt
minor_version : 537331968
compatible_brands: qt niko
creation_time : 2016-06-18 04:28:03
Duration: 00:15:40.74, start: 0.000000, bitrate: 11569 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, smpte170m/bt709/bt470m), 1920x1080, 10029 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
Metadata:
creation_time : 2016-06-18 04:28:03
Stream #0:1(eng): Audio: pcm_s16le (sowt / 0x74776F73), 48000 Hz, 2 channels, s16, 1536 kb/s (default)
Metadata:
creation_time : 2016-06-18 04:28:03
和
Input #0, matroska,webm, from 'out.mkv':
Metadata:
COMPATIBLE_BRANDS: qt niko
MAJOR_BRAND : qt
MINOR_VERSION : 537331968
ENCODER : Lavf56.40.101
Duration: 00:15:40.74, start: 0.000000, bitrate: 1445 kb/s
Stream #0:0(eng): Video: h264 (High), yuvj420p(pc), 1920x1080, SAR 1:1 DAR 16:9, 29.97 fps, 29.97 tbr, 1k tbn, 59.94 tbc (default)
Metadata:
CREATION_TIME : 2016-06-18 04:28:03
LANGUAGE : eng
ENCODER : Lavc56.60.100 libx264
DURATION : 00:15:40.742000000
Stream #0:1(eng): Audio: vorbis, 48000 Hz, stereo, fltp (default)
Metadata:
CREATION_TIME : 2016-06-18 04:28:03
LANGUAGE : eng
ENCODER : Lavc56.60.100 libvorbis
DURATION : 00:15:40.743000000
所以我有几个问题:
- 每个视频的正确比特率是多少?
- 这两个文件之间的所有信息丢失是否都包含在比特率中(或者 ffmpeg 默认情况下是否会更改导致文件大小更小的其他内容 - 如果是,那是什么?)?
- 如何确保除了容器格式和旋转之外没有其他变化?
如果您使用过滤器(例如转置过滤器)处理视频,视频 将被重新编码。
下面的命令将为您提供视频流的比特率(如果可用)。
ffprobe video.mov -select_streams v -show_entries stream=bit_rate -of compact=p=0:nk=1
查看我的回答 here,如果这没有产生值。
您当前的命令也会对音频进行重新编码。您可以跳过它,并指定比特率:
ffmpeg -i nd750_a0040.MOV -vf "transpose=clock,transpose=clock" -b:v 10M -c:a copy out.mkv
x264 编码很智能,因此它只会根据需要使用尽可能多的比特率。
您可以使用 CRF 方法,而不是坚持比特率,它旨在始终保持恒定的质量。 18 是一个很好的数字。越低越好,但视觉上通常不明显。
ffmpeg -i nd750_a0040.MOV -vf "transpose=clock,transpose=clock" -crf 18 -c:a copy out.mkv
当然,如果你的播放器支持的话,你可以只加一个旋转标签,根本不重新编码。
ffmpeg -i nd750_a0040.MOV -c copy -metadata:s:v:0 rotate=180 out.mkv