TypechoJoeTheme

半醉残影

统计

ffmeg常用命令

2021-10-29
/
0 评论
/
349 阅读
/
正在检测是否收录...
10/29

视频加图像水印

ffmpeg -i a.mp4 -i b.png -filter_complex overlay=x=0:y=0 out.mp4

# 每个30s 加3s水印
 ffmpeg -i 1.mp4 -i 123.png -filter_complex "overlay=x=0:y=0:enable='lt(mod(t,30),3)'" -y out.mp4
ffmpeg -i 1.mp4 -i header1.mov -t 15 -filter_complex "amix=inputs=2:duration=longest;[1]scale=iw*0.5:-1[open];[0][open]overlay=x=0:y=0:repeatlast=0[o1];movie=water.png [watermark];[o1][watermark]overlay=x=0:y=0:enable='gte(t,4)'[o1];[o1]subtitles=y2.ass[o1]" -map "[o1]"  ooo.mp4

图片给合成视频

ffmpeg -f image2 -i image%d.jpg video.mpg
ffmpeg -f image2 -r 60 -i output_%05d.png  1080p.mp4

ffprobe json

ffprobe -v quiet -print_format json -show_format -show_streams a.mp4

ffprobe -v quiet  -print_format json -show_format -show_streams -i 2.mp4

视频截取

裁剪视频

按时间

ffmpeg  -i 1.mp4 -vcodec copy -acodec copy -ss 00:01:00 -to 00:02:59 ./1_cut.mp4 -y

ffmpeg -ss [start] -t [duration] -i [in].mp4 -c:v libx264 -c:a aac -strict experimental -b:a 98k [out].mp4

def split_by_time(self, index, s, e):
    dst = os.path.join(self.cache_video, "%s.mp4" % index)
    args = ["ffmpeg", "-accurate_seek", "-i", self.media_path, "-ss", str(s), "-to", str(e), "-c:v", "libx264","-c:a", "copy", "-strict","experimental","-avoid_negative_ts", "1",dst, "-y"]
    r = subprocess.run(args=args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8")
    if r.returncode != 0:
        print(r)
        return
    print("success %s" % dst)

按帧

ffmpeg -i ./input.mp4 -vf "select=between(n\,20\,200)" -y -acodec copy ./output.mp4

提取视频中的帧

ffmpeg -i data/1_cut.mp4 -s 480x270 -vf "select=between(n\,5\,3569)*not(mod(n\,5))" -vsync 0 "data/sc/image-%05d.jpg"

主体是一个select 的过滤语句:
其中:

  • between(n,*) 是指 从第几帧到第几帧之间进行提取...
  • not(mode(n, K))是指每隔几帧输出一帧。

使用between可以指定需要提取开始帧和结束帧的位置,如果想要对视频中所有的帧进行间隔采样,命令如下

command_extract = "select=(gte(n\,%d))*not(mod(n\,%d))"%(60,60)
com_str = 'ffmpeg -i ' + video_path + ' -vf "%s" -vsync 0 '%command_extract + save_jpg_tmp_path + '/%06d.jpg'

按时间间隔取帧


commands := []string{
`-i`, src,
"-s", "192x108",
"-vf", `select=(gte(t\,0))*(isnan(prev_selected_t)+gte(t-prev_selected_t\,1))`,
"-vsync", "0",
"-y", path.Join(dst, `%05d.jpg`),
}

ffmpeg -i <input> -vf "select=(gte(t\,0))*(isnan(prev_selected_t)+gte(t-prev_selected_t\,21))" -vsync 0 image_%05d.jpg
    
ffmpeg -i <input> -vf "select=(gte(t\,120))*(isnan(prev_selected_t)+gte(t-prev_selected_t\,120))" -vsync 0 image_%05d.jpg

上面命令中的120的单位是s,指每120s提取视频中的一帧图像

视频信息获取

获取帧总量

ffprobe -i .\data\1_cut.mp4 -select_streams v -show_entries stream=nb_frames -of default=nk=1:nw=1 -v quiet

获取视频总时长

ffprobe <input> -select_streams v -show_entries stream=duration -of default=nk=1:nw=1 -v quiet

视频切图

ffmpeg -i 2332103105.mp4 -vf "crop=540:540:0:420" -s "384x216" -y out.jpg

缩小视频并且加上水印

ffmpeg -i demo.mp4 -vf "movie=preview.watermark.png [watermark]; [in]scale=640:360 [scale]; [scale][watermark] overlay=0:0" c.mp4

多轨道视频叠加

[0]表示第一个输入,[1]表示第二个输入,大写W表示第一个宽,小写w表示第二个宽

ffmpeg -i a.mp4 -i b.mov   -filter_complex "[1]scale=iw*0.5:-1[open];[0][open]overlay=W/2:H/2"  -vcodec libx264 -acodec aac  out.mp4 -y

# repeatlast表示不统一长度,该结束就结束
ffmpeg -i 1.mp4 -i open.mov -t 10 -filter_complex "amix=inputs=2:duration=longest;[1]scale=640:-1[open];[0][open]overlay=x=0:y=0:repeatlast=0, subtitles=1.ass" out.mp4 -y

删除所有音轨

ffmpeg -i input_file.mp4 -vcodec copy -an output_file.mp4

加黑边

 ffmpeg -i demo.mp4 -vf 'scale=1080:608,pad=1080:810:0:106:black' y.mp4

缩放裁剪

ffmpeg -i 1-1080p.mp4 -vf "scale='3413:1920',crop='1080:1920:1160:0'" -c copy -threads 4 -vcodec libx264 -y 1-1080p-h.mp4

给视频加高斯模糊边框

ffmpeg -i 2.mp4 -vf "split[a][b];[a]scale=3413:1920,crop=1080:1920:1160:0,boxblur=15:15[1];[b]scale=1080:608[2];[1][2]overlay=0:(1920-608)/2" -c copy -threads 4 -vcodec libx264 -y 2-out.mp4

生成静音音频

ffmpeg -f lavfi -t 10 -i anullsrc test.aac -y
`-bsf:v`, `h264_mp4toannexb`,

给视频图片加上文字水印

ffmpeg -i 640.jpg -filter_complex "[0]scale=220:-1[img];[img]drawtext=text='07\:43':x=w-tw-10:y=h-th-10:fontsize=24:fontcolor=white:borderw=2:bordercolor=black" o-3.jpg -y
# 封面添加文字
 ffmpeg -i 1.png -filter_complex "[0]scale=1920:1080[img];[img]drawtext=x=(w-tw)/2:y=(h-th)/2:fontfile=1.ttf:fontsize=160:fontcolor=white:borderw=10:bordercolor=orange@0.8:box=0:boxborderw=5:boxcolor=black:shadowcolor=red:textfile=1.txt:line_spacing=80" o.jpg -y

滚动文字


 ffmpeg -i 1.mp4 -t 10 -vf "drawtext=text=string1 string2 string3 string4 string5 string6 string7 :expansion=normal:fontfile=1.ttf: y=h-line_h-10:x=(mod(5*n\,w+tw)-tw): fontcolor=white: fontsize=40: shadowx=2: shadowy=2" output.mp4

ffmpeg -i 1.png -filter_complex "[0]scale=1920:1080[img];[img]drawtext=x=(w-tw)/2:y=(h-th)/2:fontfile=font/fonts/25.ttf:fontsize=140:fontcolor=white:borderw=14:bordercolor=orange@0.9:box=0:boxborderw=5:boxcolor=black:shadowcolor=red:textfile=1.txt:line_spacing=40" o.jpg -y

视频封面生成

# https://blog.csdn.net/toopoo/article/details/105603154
ffmpeg -i a.mp4 -frames:v 1 -y a.jpg

生成纯黑视频


ffmpeg -f lavfi -i color=black:1920x1080:d=3 -format rgb32 -f matroska -vcodec libx264  test1.mp4

延长视频时间

# 调整视频流速度的setpts和调整音频流的atempo应是互为倒数的,
# 这样才能保证新视频里画面和声音同步。

# 只缩放视频
ffmpeg -i open.mov  -filter_complex "setpts=2*PTS" open2.mov

# 声画同步
ffmpeg -i input.MOV -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" video.mp4

ff录屏

ffmpeg -y -f gdigrab -t 25 -r 30 -i  desktop -draw_mouse 0 -c:v h264_amf 1.mp4
pix_fmt yuv420p

缩放裁剪视频

// 裁剪视频,缩放裁剪视频到1080p
func (t *VideoTask) cropVideo(srcPath, dstPath string, width, height int64) error {
    //计算视频尺寸
    j := lib.GetFileParam(srcPath, "video")
    videoWidth := j.Get("width").Int()
    videoHeight := j.Get("height").Int()

    lib.ReportLog(t.task.Id, fmt.Sprintf("协程[%d] 视频原始尺寸:%dx%d, 缩放裁剪到:%dx%d \n", t.taskId, videoWidth, videoHeight, width, height))

    // 如果视频尺寸和目标尺寸相同,直接返回
    if videoWidth == width && videoWidth == height {
        lib.CopyFile(dstPath, srcPath)
        return nil
    }
    var format string = ""
    videoRate := float64(videoWidth) / float64(videoHeight)
    dstRate := float64(width) / float64(height)
    if videoRate == dstRate {
        // 等比例的直接缩放
        format = fmt.Sprintf("scale=%d:%d", width, height)
    } else if videoRate > dstRate {
        // 如果原视频的宽高比大于目标视频,则说明原视频宽度有多余,缩放高,裁剪宽
        dstVideoWidth := float64(height) / float64(videoHeight) * float64(videoWidth)
        beginWidth := (dstVideoWidth - float64(width)) / 2
        format = fmt.Sprintf("scale=-1:%d,crop=%d:%d:%d:0", height, width, height, int(beginWidth))
    } else {
        // 如果原视频的宽高比小于目标视频,则说明原视频高度有多余,缩放宽,裁剪高
        dstVideoHeight := float64(width) / float64(videoWidth) * float64(videoHeight)
        beginHeight := (dstVideoHeight - float64(height)) / 2
        format = fmt.Sprintf("scale=%d:-1,crop=%d:%d:0:%d", width, width, height, int(beginHeight))

    }
    commands := []string{
        "-i", srcPath,
        "-filter_complex", format,
        "-acodec", "mp3",
        "-vcodec", "libx264",
        "-pix_fmt", "yuv420p",
        "-y", dstPath,
    }
    cmd := exec.Command("ffmpeg", commands...)
    b, err := cmd.CombinedOutput()
    if err != nil {
        log.Printf(string(b))
        log.Println(commands)
        lib.ReportLog(t.task.Id, fmt.Sprintf("协程[%d] 命令:%s\n异常:\n%s", t.taskId, commands, string(b)))
        return err
    }
    return nil
}

ffmpeg 重复,延长时间

ffmpeg -i in.mp4 -vf tpad=stop_mode=clone:stop_duration=2 out.mp4
ffmpeg -i i1.mp4 -filter_complex "[0]scale=640:360[o1];[o1]tpad=start_mode=clone:start_duration=3" -y ddd.mp4

png转mov

ffmpeg -r 80  -i img/%03d.png  -vf fps=60 -vcodec qtrle out.mov -y

叠加水印并把图像转成视频

ffmpeg -i 1.png -i 2.png -filter_complex "overlay=0:0[o1];[o1]tpad=start_mode=clone:start_duration=5" -vcodec libx264 -r 32 -y 3.mp4

视频是否异常

ffmpeg -i 1.mp4 -v error -f null -

合并视频

ffmpeg -f concat -i filelist.txt  -c copy -y z1.mp4

png转rgba

ffmpeg -i demo.png -filter_complex "format=rgba" demo1.png -y
ffmpeg
朗读
赞(0)
赞赏
感谢您的支持,我会继续努力哒!

三合一收款

下面三种方式都支持哦

微信
QQ
支付宝
打开支付宝/微信/QQ扫一扫,即可进行扫码打赏哦
版权属于:

半醉残影

本文链接:

https://blog.dengyb.com/archives/113/(转载时请注明本文出处及文章链接)

评论 (0)

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月

最新回复

  1. 搭建自用导航网站 R11; JKblog
    2022-03-10
  2. JK
    2022-01-13

    {!{data:image/webp;base64,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}!}

  3. 搭建自用导航网站 R11; JKblog
    2022-01-12
  4. 搭建自用导航网站 R11; JKblog
    2022-01-12
  5. MrGao
    2019-09-03

标签云