分享

使用 ffmpeg 对视频的去水印、去除开头、结尾等基本操作

 笔记助手 2023-01-05 发布于北京

FFmpeg 是一个开放源代码的自由软件,可以运行音频和视频多种格式的录影、转换、流功能[1],包含了libavcodec——这是一个用于多个项目中音频和视频的解码器库,以及libavformat——一个音频与视频格式转换库。 --Wikipedia

FFmpeg 是一个处理音频/视频非常强大的框架,可以对音频/视频进行灵活的操作。
FFmpeg命令的典型语法是:

ffmpeg [全局选项] {[输入文件选项] -i 输入_url_地址} ...
 {[输出文件选项] 输出_url_地址} ...

安装 FFmpeg 详见 CentOS7 安装 ffmpeg

  1. 获取音频/视频文件信息
ffmpeg -i input.mp4

-i 加上文件的 url 可以查看文件的详细信息,其中就包括元数据等相关信息。

  1. 删除或修改音/视频的元数据信息
ffmpeg -i "two.mp4" -map_metadata -1 -y "input.mp4"
#-map_metadata -1 就是清楚文件的元数据,-y 表示不用再次询问是否操作
ffmpeg -i input.mp4 -metadata artist=benarchen -metadata title="Test 1" output.mp4
#-metadata artist=benarchen 表示设置该资源的作者,-metadata title="Test 1" 是设置标题
  1. 去除水印(适用于静态,如果是动态水印会很影响视频效果)
ffmpeg -i input.mp4 -b:v 3170k -vf  "delogo=x=1:y=1:w=1918:h=30:show=0" output.mp4
#-b:v 3170k 是设置视频的码率,可以不加。
#-vf  "delogo=x=1:y=1:w=100:h=30:show=0" 表示给视频添加一个类似马赛克的滤镜效果,滤镜的大小是以视频左上角为(1,1)坐标,宽为 100,高为 30 的滤镜,如果 show=1 就会有一个绿框,我这里是直接设置不可见
  1. 修改视频格式
ffmpeg -i input.mp4 -qscale 0 -y output.mp4
#-qscale 0 参数是为了不影响资源的质量
  1. 剪切视频
    对视频的剪切主要有两个,去除片头和去除片尾,FFmpeg 要去除固定时长的片头非常的简单,使用下面的命令就可以了:
ffmpeg -ss 00:03:00 -i input.mp4 -t 60 -c:v copy -c:a copy output.mp4
#-ss 00:03:00 表示从 3 分钟开始截取(也就是去除 3 分钟的开头)
#-t 60/-to 60 这里 -t 和 -to 都是一样的效果,意思是从截取开始往时间轴截取 60s 
#-c:v copy -c:a copy 意思是复制源文件的编码格式,这样会比较快
#如果只是去除 3 分钟的片头可以不用加 -t 或者 -to 命令,如下:
ffmpeg -ss 00:03:00 -i input.mp4 -c:v copy -c:a copy output.mp4

但是还有一种情况就是在剪掉固定时长片头的同时也剪掉固定时长的片尾,FFmpeg 官方没有直接提供这中功能,一种最常用的思路是在 shell 脚本中先用 FFmpeg -i 把文件的元数据信息保留下来,再从元数据信息中提取出视频的时长,用视频的总时长减去要剪掉的开头时长后结尾时长就是我们需要的实际时长了,直接上命令吧

#!/bin/bash
#我这里要切除的开头和结尾都是 7 秒
beg=7
end=7

#用 for 循环直接获取当前目录下的 mp4、mp3、avi 等文件循环处理,单个文件可以去掉 for 循环
for i in (*.mp4,*.mp3,*.avi ); do
	#将元数据信息临时保存到 tmp.log 文件中
    nohup /usr/local/ffmpeg/bin/ffmpeg -i "$i" > tmp.log
    #获取视频的时长,格式为  00:00:10,10 (时:分:秒,微妙)
    time="`cat /usr/local/ffmpeg/tmp.log |grep Duration: |awk  '{print $2}'|awk -F "," '{print $1}'|xargs`"
    echo $time
    #求视频的总时长,先分别求出小时、分、秒的值,这里不处理微秒,可以忽略
    hour="`echo $time |awk -F ":" '{print $1}' `"
    min="`echo $time |awk -F ":" '{print $2}' `"
    sec="`echo $time |awk -F ":" '{print $3}'|awk -F "." '{print $1}' `"
    #echo $hour $min $sec
    num1=`expr $hour \* 3600`
    num2=`expr $min \* 60`
    num3=$sec
    #计算出视频的总时长(秒)
    sum=`expr $num1 + $num2 + $num3`  
    
    #总时长减去开头和结尾就是截取后的视频时长,并且这里不需要再转回 hour:min:sec 的格式,直接使用结果即可
    newtime=`expr $sum - $beg - $end`
    echo $newtime
    /usr/local/ffmpeg/bin/ffmpeg -ss 00:00:07 -i $i -t $newtime -c:v copy -c:a copy /data/tmp/$i -y
done

上面的 shell 脚本可以根据实际情况作出调整。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多