FFmpeg裁剪视频及局部模糊

 查看视频信息:

 ffprobe '.\咬一口兔娘 - 极乐净土.mp4'


视频裁剪

左右裁剪, 视频的画面部分宽度裁剪为原始宽度的一半,同时调整视频的尺寸

对比不同 crf 压片后的大小和码率,crf默认23, 值越小,码率越大,文件越大

使用 h265 压片,码率最小,文件最小,但是压片时间也最长


ffmpeg -i input.mp4 -filter:v "crop=in_w/2:in_h:0:0,scale=1280:1440" -crf 22 -c:a copy output.mp4

ffmpeg -i input.mp4 -filter:v "crop=in_w/2:in_h:0:0,scale=1280:1440" -crf 22 -c:v libx265 -c:a copy output.mp4

ffmpeg -i input.mp4 -filter:v "crop=in_w/2:in_h:0:0,scale=1280:1440" output.mp4




视频关键帧的位置
如何通过关键帧获取视频时间点 ?
ffprobe -select_streams v -show_frames -show_entries frame=pict_type,coded_picture_number -of csv output.mp4 | findstr I


生成截图
本想通过视频关键帧截图,应该截图会更清新? 但是没找方法。
保存关键帧方法, 但看起来图像也不是很清晰,暂不知道原因

ffmpeg -i input.mp4 -vf "select='eq(pict_type\,I)'" -vsync vfr output_%03d.jpg

[libx264 @ 000002bd28157380] frame I:348   Avg QP:20.40  size: 46658
[libx264 @ 000002bd28157380] frame P:3842  Avg QP:24.06  size: 22554
[libx264 @ 000002bd28157380] frame B:10708 Avg QP:24.77  size:  2929


图片清晰度参考

def image_definition(img_path):
    img = cv2.imread(img_path)
    img2gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    imageVar = cv2.Laplacian(img2gray, cv2.CV_64F).var()
    return imageVar





从某一秒截图,可以看到并不是最清晰的,-ss 在 -i 之前可以精确截取时间
ffmpeg -ss 00:02:47 -y -i output.mp4 -vframes 1 output.jpg

视频帧率60fps, 尝试1秒钟中截图60张,看是否有清新的,并无明显差别,文件大小有确有差别
ffmpeg -ss 00:02:47 -y -i output.mp4 -vframes 60 output-%2d.jpg

整个视频每5秒截图一张, fps = 1/5= 0.2
ffmpeg -i output.mp4 -vf fps=0.2 output-%05d.jpg




需要模糊区域定位

使用工具:https://imagej.nih.gov/ij/download.html




预览模糊区域

预览时没有声音?

ffplay -f lavfi -i "movie=output.mp4,delogo=x=6:y=574:w=1268:h=720:show=1"


视频画面局部模糊

ffmpeg -i output.mp4 -ss 00:01:28 -filter_complex "[0:v]crop=1268:720:6:600,gblur=sigma=10[blur];[0:v][blur]overlay=6:600" output2.mp4


干脆利落,下面还是直接将视频分为上下两部分,然后将下半部分模糊

ffmpeg -i output.mp4 -filter_complex "[0:v]crop=iw:ih/2:0:0[top];[0:v]crop=iw:ih/2:0:ih/2,boxblur=20[bottom];[top][bottom]vstack" -c:a copy output6.mp4


开始操作视频

将视频按时间分成两段

ffmpeg -i input.mp4 -ss 00:00:00 -t 00:01:28 -c:v copy -c:a copy output1.mp4 -ss 00:01:28 -c:v copy -c:a copy output2.mp4 

将视频后半段生成的视频,将画面分成上下部分,并对下部分3/5做模糊处理

 ffmpeg -i output2.mp4-filter_complex "[0:v]crop=iw:ih*2/5:0:0[top];[0:v]crop=iw:ih*3/5:0:ih*2/5,boxblur=30[bottom];[top][bottom]vstack" -c:a copy output3.mp4

合并前后两个视频

input.txt文件内容

file 'output1.mp4'

file 'output3.mp4'


ffmpeg -f concat -i input.txt -c copy output4.mp4


实现了局部模糊





评论

  1. 1. 关键帧 I帧 并不一定是最清晰的,只是它是帧内压缩,文件大小比 B帧 P帧大
    2.即使是一张静态图片生成的几秒视频, 里面看的B帧P帧也存在码流信息,表明它和前面I帧的内容是一样的,故视频截取的 I B P 帧成为图片,也是能看到数据的,因为是在原始数据中处理,不是在码流数据中处理。

    回复删除

发表评论

此博客中的热门博文

Twitter视频下载地址分析