首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用最小重编码的FFMPEG添加覆盖。

使用最小重编码的FFMPEG添加覆盖。
EN

Stack Overflow用户
提问于 2015-12-09 14:00:24
回答 2查看 5.6K关注 0票数 11

FFMPEG对于切割视频的一部分是非常有用的,而不需要重新编码视频.

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

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

还有什么选项,我可以用来使重新编码最小化吗?

目的当然是为了保持视频的质量,就像原来的一样。

(我完全不要求重新编码,但我不知道这怎么可能.)

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-04 12:44:57

整个视频将得到重新编码,如果你覆盖一个图像的一部分。避免重新编码整件事情的一种方法是裁剪出希望覆盖的部分,并且只重新编码该部分(请参阅-t duration开关和文档中的-ss position开关)。

您将希望在整个过程中维护当前的编码参数。这在拆分时很容易实现,因为您可以为编解码器交换机(Es)(如-c:a copy -c:v copy )使用copy参数。

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

Part1:电影的开始(你不想覆盖的前10秒)(用ffmpeg -i SourceFileName -t 10 -c:a copy -c:v copy SourceFileNameP1.mkv获得SourceFileName是你要处理的视频。Part2:电影的一部分,在10秒到20秒之间,你想要覆盖(用ffmpeg -i SourceFileName -ss 10 -t 10 -c:a copy -c:v copy SourceFileNameP2获得) Part3:电影的结尾(用‘`ffmpeg -ss 20 -c:a复制-c:v拷贝获得)

额外提示:,通过将‘-ss参数移到输出文件之前,您可以获得更慢但更精确的裁剪。这将从输出中删除帧,而不是试图在创建输出之前在输入上寻求正确的位置。

如果您不知道源文件的编码细节,可以使用ffprobe SourceFileName或我最喜欢的mediainfo SourceFileName获取它们

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

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

代码语言:javascript
复制
#!/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

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

这可能会大大减少您的重新编码时间,这取决于材料的长度,并有额外的好处,只有重新编码,必须重新编码。

如何覆盖您的重新编码段覆盖这里,您可以调整接受的答案,以匹配您的材料。

票数 3
EN

Stack Overflow用户

发布于 2019-04-24 17:57:45

另一种方法是与一名球员合作:

代码语言:javascript
复制
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]"

不需要编码。没有质量损失。即时满足。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34180671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档