11

FFMPEG 对于剪切视频的一部分非常有用,无需重新编码视频。

我知道也可以在视频的某个部分(例如从 10 秒到 20 秒)中使用 FFMPEG 将叠加图像添加到视频中。

我的问题是:如果我对图像进行这种叠加,整个视频会因此被重新编码吗?或者只是相关的持续时间将被编码?

还有什么选项可以用来使重新编码最小化?
目的当然是保持原始视频的质量..
(我根本不要求重新编码,但我不明白这怎么可能......)

谢谢

4

2 回答 2

3

如果您在其中的一部分上叠加图像,整个视频将被重新编码。您可以避免重新编码整个内容的一种方法是剪掉您希望覆盖的部分并仅重新编码该部分(请参阅文档-t duration中的开关和-ss position开关

您将希望在整个过程中保持当前的编码参数。这在拆分时很容易做到,因为您可以将复制参数用于编解码器开关,例如-c:a copy -c:v copy

概念化(请注意,这些不是完整的命令):

第 1 部分:电影的开头(您不希望覆盖的前 10 秒)(使用ffmpeg -i SourceFileName -t 10 -c:a copy -c:v copy SourceFileNameP1.mkvSourceFileName 是您要处理的视频获得。第 2 部分:要覆盖的 10 到 20 秒之间的电影部分(使用 获得ffmpeg -i SourceFileName -ss 10 -t 10 -c:a copy -c:v copy SourceFileNameP2)第 3 部分:结束电影(通过`ffmpeg -ss 20 -c:a copy -c:v copy获得)

额外提示:通过将 `-ss 参数移动到输出文件之前,您可以获得更慢但更精确的切割。这将从输出中丢弃帧,而不是在创建输出之前尝试寻找输入上的正确位置。

如果不知道源文件的编码细节,可以用ffprobe SourceFileName或者我的收藏mediainfo SourceFileName

我建议至少将 Matroska 容器用于中间输出,因为它具有灵活性和低开销。

这是一个脚本,您可以使用(在基于 Debian 的系统上)来获取匹配的必要参数。

#!/bin/bash
#mknfo.sh
#Written by Elder Geek for the Stack Exchange network
# 1/1/2018 
####################################################################################################
#bash script to create an nfo file which includes information to help joining video clips          #
####################################################################################################
# This function will create an nfo file including the tech specs for a specified media file        #
####################################################################################################
function shortinfo {
   echo $@
      mediainfo --Inform="General;Duration=%Duration/String2%\nFile size=%FileSize/String1%\nBit Rate=%OverallBitRate/String% " "$@"
   echo -n "Video: "
   mediainfo --Inform="Video;FrameRate=%FrameRate/String% BitRate=%BitRate/String% Resolution=%Width%x%Height% Codec=%CodecID%" "$@";
    echo -n "Audio: "
   mediainfo --Inform="Audio;Mode=%BitRate_Mode/String% BitRate=%BitRate/String% Format=%Format%" "$@";
   echo "-----------------------------------------------------------------------------"
}
####################################################################################################
# This function will check for the existence of mediainfo and attempt installation if not found     #
####################################################################################################
function getmi {
   echo "mediainfo is required and not found. Attempt install Y/N"
   read -n 1 solve
    if [ $solve=={Yy} ]
    then sudo apt-get -y install mediainfo
    else echo "Cannot continue"
    exit 1
    fi
}
####################################################################################################
# Main program                                             #
####################################################################################################
if [ $# -ne 1 ] 
    then    
    echo Error 
    echo "$0" requires a single filename argument. Example: "$0" Videofile
    exit 2
fi
exist=$(which mediainfo)
    if [ "$exist" == "" ];
    then getmi
    fi
target=$(pwd)"/"$1".nfo"
    if [ -e $target ] 
    then 
    echo Error: "$1.nfo" already exists
    exit 3
    fi
echo "Creating $target"
        shortinfo "$1" > "$target"
    exit 0


Now you'll want to re-encode the overlay section (Part2) of the video to exactly match the parameters (same audio and video codecs and same bitrate and sample rate as the original of Part1 and Part3 to allow for joining.

完成后,您可以将所有部分连接在一起。

mkvmerge -o joined.mkv Part1 + Part2Reencoded + Part3

请注意,重新编码总是会导致一些质量损失,因此片段之间的连接可能会显示出可见的缺陷。这可能会或可能不会因覆盖同时出现和消失的代码而引起的分心。

这可能会根据材料的长度显着减少重新编码的时间,并且具有仅重新编码必须重新编码的内容的额外好处。

此处介绍了如何覆盖重新编码的片段,您可以调整接受的答案以匹配您的材料。

于 2017-10-04T12:44:57.087 回答
1

另一种方法是使用播放器:

ffplay -f lavfi "movie=main.mkv[bg];movie=logo.png[fg];[bg][fg]overlay=W-w-10:H-h-10:enable=between'(t,10,20)'[out0];amovie=main.mkv[out1]"

无需编码。没有质量损失。及时行乐。

于 2019-04-24T17:57:45.597 回答