『漫游』酷论坛>『字幕制作交流区』>[求助]卡拉OK的字幕怎 ..

MeteorRain@2004-07-28 21:12

[php]//Copyright (C)2004 MeteorRain
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either
//version 2 of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

//使用方法:
//在$text = "下面一行,贴入小灰熊插件生成的代码(karaoke.add(……))格式,运行php程序即可。
//也可以制作一个提交页面,将$text = "……";整个删去,改成
//$text = $_POST['提交索引'];
//提交索引是textarea的name属性……

//1.0
//2004.7.28

header("Content-type: plain/text");
header("Content-Disposition: attachment; filename=1.ssa");
error_reporting(0);
$text = "
karaoke.add('00:33.227', '00:37.107', '[....]季節はずれの[beach ][side]', '1535,263,274,287,290,231,344,327,329');
karaoke.add('00:37.468', '00:40.604', '夜に隱れ[た...]', '264,246,234,410,1982');
karaoke.add('00:43.595', '00:46.076', '君の橫顏は', '336,463,697,632,353');
karaoke.add('00:46.539', '00:50.107', '何をみつめてるの?', '418,527,232,319,431,298,352,480,511');
karaoke.add('00:52.205', '00:54.836', '僕らは何一つ', '757,305,298,439,599,233');
karaoke.add('00:55.414', '00:57.077', '知るこ[との]ない', '231,250,272,281,333,296');
karaoke.add('00:57.077', '00:58.967', '未來の為に', '194,320,311,698,367');
karaoke.add('00:59.974', '01:01.475', '[手に][入れたり]', '727,774');
karaoke.add('01:01.533', '01:03.645', '[投げ出した][りして]', '1352,760');
karaoke.add('01:04.259', '01:08.475', '儚く誘う行方めざして', '719,375,538,335,418,591,303,328,238,371');
karaoke.add('01:08.733', '01:09.787', '[Flying ][Gone]', '463,591');
";

$sp1_text = explode("\n", $text);
for($i = 0; $i < count($sp1_text); $i++)
{
if($sp1_text[$i] == "") continue;
list($d1, $t1, $d2, $t2, $d3, $s, $d4, $tp, $d5) = explode("'", $sp1_text[$i]);
if(strpos($d1, ".add(") === false) continue;
$t1 = "0:" . substr($t1, 0, 8);
$t2 = "0:" . substr($t2, 0, 8);
$sp_t = explode(",", $tp);
$dest_t = "";
$ntime = 0; //1ms精确度的时间点
$dtime = 0; //10ms精确度的时间点
$wordpos = 0;
for($j = 0; $j < count($sp_t); $j++)
{
$word = substr($s, $wordpos, 1);
if($word == "")
break;
if($word == "[")
{
$word = "";
for(; substr($s, $wordpos + 1, 1) !== "]"; $word .= substr($s, ++$wordpos, 1));
$wordpos += 2;
}
elseif($word > "{")
{
$word = substr($s, $wordpos, 2);
$wordpos += 2;
}
else
$word = substr($s, $wordpos++, 1);
$ntime += $sp_t[$j];
$dest_t .= "{\\\\\K" . strval((int)($ntime / 10 - $dtime)) . "}" . $word;
$dtime += (int)($sp_t[$j] / 10);
}
printf("Dialogue: 0,%s,%s,Default,,0000,0000,0000,,%s\n", $t1, $t2, $dest_t);
}
?>
[/php]
引用

wangh@2004-07-28 21:14

引用
最初由 MeteorRain 发布
说一个你的程序的潜在的问题
看你算时间用的都是四舍五入吧
那么假如每个时间长都是295的话,是不是都会变成\K30?也就是慢了0.005秒吧……
那么假如我连续排1000个,最后一个就会慢5秒吧…………
虽然不是明显的错误,但是总是一个小小的缺陷……


不会的,这点已经考虑到了,四舍五入的是根据连续的时间来计算的,而不是分别对每个时间来计算,所以不会出现误差累加的情况

就象这样
karaoke.add('01:28.750', '01:30.696', 'aaaaaaa', '295,295,295,295,295,295,295');
转换后为
Dialogue: 0,0:01:28.75,0:01:30.69,Default,,0,0,0,,{\K29}a{\K30}a{\K29}a{\K30}a{\K29}a{\K30}a{\K29}a
引用

MeteorRain@2004-07-28 21:24

引用
最初由 wangh 发布
不会的,这点已经考虑到了,四舍五入的是根据连续的时间来计算的,而不是分别对每个时间来计算,所以不会出现误差累加的情况
原来如此……我比较讨厌vb.net……至于vb6,除了参加竞赛以外,平时都不用的-_-看着不习惯……
php版本刚刚小小更新了一下,希望没什么bug……大家可以来测试一下……
引用

MeteorRain@2004-07-28 21:27

突然想起要PS一句:你的vb里用了goto,很不好的习惯啊……就算用函数调用也比goto强……
引用

wangh@2004-07-28 21:56

引用
最初由 MeteorRain 发布
原来如此……我比较讨厌vb.net……至于vb6,除了参加竞赛以外,平时都不用的-_-看着不习惯……
php版本刚刚小小更新了一下,希望没什么bug……大家可以来测试一下……


呵呵,我到是很习惯VB的说,上面那个和C语言几乎一样,我就看得头晕-_-
至于VB.net嘛,就象个大杂烩,乱七八糟什么都有,很有趣的^^

引用
最初由 MeteorRain 发布
突然想起要PS一句:你的vb里用了goto,很不好的习惯啊……就算用函数调用也比goto强……


因为这里比较简单,所以没考虑太多就直接用了,规模大点的就肯定不会用goto了
这样就可以不用了
Do
pStr = pStr + 1
If i > SubTimeText.Length - 1 Then Exit Do
tStr = (Mid(inText, pStr, 1))
If tStr = "[" Then
Chars = 1
ElseIf tStr = "]" Then
Chars = 0
i = i + 1
Else
If Chars Then
SubText(i) = SubText(i) & tStr
Else
SubText(i) = tStr
i = i + 1
End If
End If
Loop While pStr < tST
引用

MeteorRain@2004-07-28 22:08

php语言就是从C发展来的,效率很不错,语句格式也很喜欢。特别是这里一句:
for(; substr($s, $wordpos + 1, 1) !== "]"; $word .= substr($s, ++$wordpos, 1));

C语言里的for可以用得非常活。第一句是空语句,而第3句原本是$wordpos++的,而现在可以和赋值语句用在一起写进for语句体中。你可以看到循环体就是一个“;”……
而且这样一句就把[]里的东西分离出来了……感觉就是,简洁高效
引用

kiasushou@2004-07-29 08:09

小灰熊 的 插件 是 adobe premier 用的吧? 具體是如何操作的,也是看 聲波?
引用

monkeyking2002@2004-07-29 10:22

引用
最初由 kiasushou 发布
小灰熊 的 插件 是 adobe premier 用的吧? 具體是如何操作的,也是看 聲波?

汗。。。。楼上的是黑猫警长呢。。。不是灰熊。。。。-_-||
引用

ZhenGod@2004-07-29 10:33

引用
最初由 monkeyking2002 发布

汗。。。。楼上的是黑猫警长呢。。。不是灰熊。。。。-_-||

倒~~、

小灰熊是 adobe premier的一个插件的名字, 不是指人.

倒倒. 黑猫警长, 什么时候你也这样叫了? ~~
引用

monkeyking2002@2004-07-29 11:17

回楼上。。。J大大教的。。。
引用

wangh@2004-07-29 11:38

引用
最初由 MeteorRain 发布
php语言就是从C发展来的,效率很不错,语句格式也很喜欢。特别是这里一句:
for(; substr($s, $wordpos + 1, 1) !== "]"; $word .= substr($s, ++$wordpos, 1));

C语言里的for可以用得非常活。第一句是空语句,而第3句原本是$wordpos++的,而现在可以和赋值语句用在一起写进for语句体中。你可以看到循环体就是一个“;”……
而且这样一句就把[]里的东西分离出来了……感觉就是,简洁高效

所以就看得头晕了……-_-

引用
最初由 monkeyking2002 发布
汗。。。。楼上的是黑猫警长呢。。。不是灰熊。。。。-_-||

我倒。。。。。。>_<
引用

MeteorRain@2004-07-29 11:51

能学好PHP的话是很合算的……将来找工作啊……或者学习C语言啊,都有很大的帮助的
引用

monkeyking2002@2004-07-29 13:30

引用
最初由 wangh 发布


我倒。。。。。。>_<


你倒什么啊。。。。不是这么叫吗。。。- -
引用

ZhenGod@2004-07-29 13:43

引用
最初由 monkeyking2002 发布


你倒什么啊。。。。不是这么叫吗。。。- -


我证明不是~~~~
引用

MeteorRain@2004-07-29 14:55

引用
最初由 ZhenGod 发布
我证明不是~~~~
等花园好了以后给我转过去然后+HB吧哇哈哈:o:o:o:o:o:o:o:o:o
引用

«1234»共4页

| TOP