ffmpeg吧 关注:1,289贴子:4,642
  • 7回复贴,共1

一个视频文件整理脚本

只看楼主收藏回复

目的:检查指定目录下的所有视频文件,找到有广告软字幕和广告图片的文件,删除文件中的广告软字幕和广告图片
我自己花了点时间写一个windows 下的powershell 脚本用于达到上述目的。
脚本如下:
$backup_orginal_file = 1
$remove_subtitles = 1
$remove_images = 1
$files = get-childitem | where extension -in '.mkv', '.mp4'
foreach ($file in $files) {
$name = $file.name
$f = ffprobe -loglevel quiet -select_streams s -show_entries stream=index,codec_type -of json "$name" | ConvertFrom-Json
$txt_count = $f.streams.length
if ($txt_count -gt 0) {
echo "$($name)有$($txt_count)条字幕"
}
$disp = ffprobe -loglevel quiet -select_streams v -show_entries disposition=attached_pic,timed_thumbnails,still_image -of json "$name" | ConvertFrom-Json
$img_count = 0
foreach ($stream in $disp.streams) {
if ($stream.disposition.attached_pic -eq 1 -or $stream.disposition.timed_thumbnails -eq 1 -or $stream.disposition.still_image -eq 1) {
$img_count++
}
}
if ($img_count -gt 0) {
echo "$($name)有$($img_count)张图片"
}
if ($txt_count -eq 0 -and $img_count -eq 0) {
continue
}
if ($remove_subtitles -eq 0 -and $remove_images -eq 0) {
continue
}
$from_name = "[backup] $($name)"
rename-item -LiteralPath $name -NewName $from_name
if ($remove_subtitles -eq 1 -and $remove_images -eq 1) {
ffmpeg -loglevel quiet -i "$from_name" -map 0:V -map 0:a -c copy "$name"
echo "$($name)已去除字幕和图片"
} elseif ($remove_subtitles -eq 0 -and $remove_images -eq 1) {
ffmpeg -loglevel quiet -i "$from_name" -map 0:V -map 0:a -map 0:s -c copy "$name"
echo "$($name)已去除图片"
} elseif ($remove_subtitles -eq 1 -and $remove_images -eq 0) {
ffmpeg -loglevel quiet -i "$from_name" -map 0:v -map 0:a -c copy "$name"
echo "$($name)已去除字幕"
}
if ($backup_orginal_file -eq 0) {
reomove-item -LiteralPath "$from_name"
}
}


IP属地:江苏1楼2024-12-11 19:46回复
    用法:打开视频文件目录,按住Shift键,点击鼠标右键,在弹出的快捷菜单中,选择【在此处打开PowerShell窗口】,出现PowerShell 命令行窗口中,将脚本粘贴进去执行就行了。
    关键思路:
    判断是否有字幕:通过检查是否有字幕流获取,-select_streams s
    判断是否有图片:检查每个流中的disposition中attached_pic,timed_thumbnails,still_image 三个字段值是否为1,为1则认为是有图片
    前3行为配置值:
    # 是否备份原始文件,1=是,0=否
    $backup_orginal_file = 1
    # 是否删除字幕,1=是,0=否
    $remove_subtitles = 1
    # 是否删除图片,1=是,0=否
    $remove_images = 1
    后面2项为0时,只显示是否有字幕和图片,不作删除操作
    使用删除字幕时要当心,只有确认视频有硬字幕,软字幕为广告时才设置为1
    免责声明
    此脚本仅用于学习,作者不对用户的误操作造成的损失承担任何责任。


    IP属地:江苏2楼2024-12-11 20:02
    回复
      道友下的资源都好奇怪,封装了专辑封面和软字幕就是广告。找几个正规网站下?
      卡在一个问题上很久了,在想办法自动去除动漫、剧集中的片头曲、片尾曲、广告、中段等高度重复性的视频段。难点是自动识别切割时间点。B站资源还可以参考缓存中跳过片头片尾时间码,可以提高识别效率,其他没参考的识别不准确,还得手工校对生成切割时间。


      IP属地:浙江3楼2024-12-11 22:00
      收起回复
        请问各位大佬 如何用批处理命令
        去掉片头片尾


        IP属地:上海来自Android客户端4楼2024-12-13 15:04
        收起回复
          脚本基本没有通用型。只能给和你使用相同视频网站的道友分享。


          IP属地:广东5楼2025-02-19 17:01
          回复
            压入视频的字幕和logo才是常态……如果只是外挂字幕和logo,我直接都是原视频完全去除多余视频流和字幕,然后字幕网站下载字幕重新封装,特殊版本没有适合的字幕,甚至可以请出AI自动翻译生成字幕文件,然后再封装进去,现在AI自动翻译生成字幕牛得不行,字幕网站的听译怕是要失业了……


            IP属地:云南6楼2025-02-21 02:05
            回复