如何自动将提交信息嵌入到我正在跟踪的字幕文件中?

时间:2014-08-23 16:45:44

标签: git ffmpeg

我使用git来跟踪*.ass字幕文件。 以下是*.ass文件的示例:

[Script Info]
; Script generated by Aegisub 3.1.2
; http://www.aegisub.org/
Title: Default Aegisub file
ScriptType: v4.00+

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour,    BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1
Style: titr,DejaVu     

Sans,20,&H007DDBFA,&H000000FF,&H00000000,&HFF000000,0,0,0,0,100,100,0,0,1,2,2,1,10,10,10,1

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.46,0:00:11.22,Default,,0,0,0,,Если это можно было бы
Dialogue: 0,0:00:03.44,0:00:08.96,titr,,0,0,0,,{\pos(20,240)\fad(600,600)}бывший министр

提交后我将字幕刻录到视频中:

ffmpeg -i video.avi -vf "ass=subtitle.ass" out.avi

我的目标是在电影开头显示10秒的提交日期。这应该自动完成。

1)通过修改subtitle.ass本身可以轻松完成,但在提交后我无法完成,还有其他原因。

2)可以通过ffmpeg从命令行完成:How to use ffmpeg to add a text to avi video?

问题是,在这种情况下,将显示整个电影长度的文本。

3)我可以将* .ass文件复制到临时目录,插入日期,渲染和删除* .ass文件。

有更简单的方法吗?

1 个答案:

答案 0 :(得分:2)

你的第三种方法似乎很容易。这是一个可能的实现。

enter image description here

我使用的树结构是

$ tree
.
├── burn_sub_w_commit_date
├── sub_repo
│   └── sub.ass
└── test_video.avi

,其中

  • burn_sub_w_commit_date是一个shell(bash)脚本,
  • sub.ass是您在问题中发布的原始字幕文件,
  • sub_repo是一个Git存储库,用于跟踪您在sub.ass上的工作(并且至少包含一个提交),
  • test_video.avi只是我在Youtube上发现的一些视频。

以下是burn_sub_w_commit_date的内容:

#!/bin/sh
# burn last commit date with subtitles in video

# exit on any errors
set -e

# extract the head of test.ass and copy it to a temporary file
sed '/Dialogue:/,$d' sub.ass > temp_head.ass

# extract the tail of test.ass and copy it to a second temporary file
sed -n '/Dialogue:/,$p' sub.ass > temp_tail.ass

# write the commit date to a third temporary file
printf "Dialogue: 0,0:00:00.00,0:00:10.00,Default,,0,0,0,,`git log -1 --format="%cD" | sed 's/ [+\-][0-9]\{4\}//'`\n" > temp_mid.ass

# concatenate all three temporary files into a fourth one
cat temp_head.ass temp_mid.ass temp_tail.ass > temp.ass

# clean up (delete the first three temporary files)
rm temp_head.ass temp_tail.ass temp_mid.ass

# burn subtitles into the video
ffmpeg -i "../test_video.avi" -vf "ass='temp.ass'" "../test_video_out.avi"

# clean up (delete the last temporary file)
rm temp.ass

现在,如果您cdtest_video/sub_repo并运行

sh ../burn_sub_w_commit_date

在我的情况下,字幕将刻录到视频和当前分支上次提交的日期

Sun, 24 Aug 2014 00:01:23

将在一开始显示10秒钟。

当然,您可能希望改善自动化;使脚本可执行并让它接受相关路径作为参数似乎是下一个明显的步骤......但基本的想法就在那里。