使用ffmpeg处理视频而不会降低质量

时间:2016-08-17 09:36:40

标签: video ffmpeg video-processing bitrate

我正在使用ffmpeg使用以下代码旋转视频:

ffmpeg -i nd750_a0040.MOV -vf "transpose=dir=clock, transpose=dir=clock" out.mkv

生成的文件几乎比输入小10倍。 我发现this question解决了一个相关的问题,并建议将ffmpeg从以下内容中获取编解码器和比特率:

bitratev="$(ffmpeg -i "$1" -f null - |& grep video: | awk -F'[:|kB]' '{print $2}')"
codecv="$(ffprobe -loglevel error -select_streams v:0 -show_entries stream=codec_name -of default=nk=1:nw=1 "$1")"

但是,这两个命令都为我们提供了相同的输出:2643h264。 我是否正确假设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会改变导致文件较小的其他因素 - 如果是,那么什么?)?
  • 如何确保除容器格式和轮换之外没有其他任何更改?

1 个答案:

答案 0 :(得分:2)

如果您使用过滤器操作视频,例如转置过滤器,视频将被重新编码

如果可用,下面的命令将为您提供视频流的比特率。

async.eachLimit((question.answers || []), 4, function(answer, callback) {
        var votedUsers = [];
        votedUsers = votedUsers.concat(answer.get("votes"));
        answer._doc.votes = answer.get("votes").length;
        var ansId = answer.answerId;
        var aData = {
            answer: answer,
            users: {}
        };
        AnswersVote.find({
            '_id': {
                $in: getUniqueIds(votedUsers)
            }
        }, {
            user: 1
        })
            .populate('user', 'name gender')
            .exec(function(err, votesUsers) {
                if (!err) {
                    votesUsers.forEach(function(vote) {
                        var user = vote.get("user");
                        if (user) {
                            aData.users[user.get("id")] = user;
                        }
                    });
                    console.log("ADATA:" + JSON.stringify(aData));
                }
                callback(err);
            });

    },
    function(error) {
        next();
    }
});

如果这不会产生值,请参阅我的回答here

您现在的命令也会重新编码音频。您可以跳过它,并指定比特率:

ffprobe video.mov -select_streams v -show_entries stream=bit_rate -of compact=p=0:nk=1

x264编码非常智能,因此它只会根据需要使用尽可能多的比特率。

您可以使用CRF方法,而不是坚持比特率,旨在始终保持恒定的质量。 18是一个很好的数字。越低越好,但在视觉上通常不会明显。

ffmpeg -i nd750_a0040.MOV -vf "transpose=clock,transpose=clock" -b:v 10M -c:a copy out.mkv

当然,如果你的播放器支持它,你可以添加一个旋转标签,而不是重新编码。

ffmpeg -i nd750_a0040.MOV -vf "transpose=clock,transpose=clock" -crf 18 -c:a copy out.mkv