3
3
2014
17

《冰雪奇缘》之缘——A站弹幕 JSON 转 crt

本文来自依云's Blog,转载请注明。

都是《冰雪奇缘》惹的祸,不仅画面美仑美奂,音乐激荡人心,而且还玩多语言版本的主题曲

you-get 竟助纣为虐,把歌词给下回来了!只叹 soimort 没有好人做到底,留一个语义不详的 JSON 让我情何以堪。

好在 muzuiget 才识不凡,有码略释其义,遂如我光影、声音、文字三位一体之愿!

编成代码数十行,只为女王歌一曲:

#!/usr/bin/env python3

import json
import sys

def cmtjson_reader(f):
  data = json.load(f)
  for o in data:
    c = o['c'].split(',')
    m = o['m']
    # see
    # https://github.com/muzuiget/niconvert/blob/master/niconvert/libsite/acfun.py
    start = float(c[0])
    yield start, m

def format_time(t):
  s, ms = divmod(t, 1)
  s = int(s)
  ms = int(ms * 1000)
  m, s = divmod(s, 60)
  h, m = divmod(m, 60)
  return '%d:%02d:%02d,%03d' % (h, m, s, ms)

def crt_writer(f):
  i = 0

  fmt = '%d\n%s --> %s\n%s\n\n'
  try:
    while True:
      t, m = yield
      ts = format_time(t)
      if i != 0:
        f.write(fmt % (i, format_time(old_t), ts, old_m))
      i += 1
      old_t = t
      old_m = m
  except GeneratorExit:
    f.write(fmt % (
      i+1, format_time(t), format_time(t+2), m))

def main():
  w = crt_writer(sys.stdout)
  w.send(None)
  old_d0 = 0
  for d in cmtjson_reader(sys.stdin):
    if d[0] < old_d0:
      break
    w.send(d)
    old_d0 = d[0]

if __name__ == '__main__':
  main()

mplayer 君虽识得 UTF-8 之码,却不通 fontconfig 之术,部分文字沦为了下划线。又及。

Category: python | Tags: python | Read Count: 4566
adam8157 说:
Mar 03, 2014 11:19:43 PM

This config works for me:

# Turn on SSA/ASS subtitle rendering.
ass=on

# Specify the subtitle codepage.
subcp=enca:zh:UTF-8

# Tells MPlayer to handle the subtitle file as unicode.
unicode=yes

# Enables the usage of fontconfig managed fonts.
fontconfig=yes

# Determines the Fontconfig font pattern.
font="Sans Serif"

sorz 说:
Mar 04, 2014 02:39:25 AM

师长好文笔,妙!
只是行文中这 CRT 三字,看着似曾相识,却又透些许点违和之感。
在下左思右想,这三字应与黑色家电无关,那又是何物。
忽觉派绅字里码间透着股 SubRip 之味,不知其与 SRT 有无瓜葛?

eleven.i386 说:
Mar 04, 2014 10:15:49 AM

楼上均好文采, 让我乡野小子无地自容, 虽发粪涂墙, 仍不及楼上十之一二. 故, 不敢终日晃晃, 无所事事, 每思至此, 中华大地,人才鸡鸡, 我楚国 物华天宝,岂能无人焉, 遂 日后两耳不问墙外事, 一心只为大Python

Avatar_small
依云 说:
Mar 04, 2014 02:29:33 PM

原来配置一个选项就可以了呀,回去了试试 :-)

Star Brilliant 说:
Mar 04, 2014 10:03:14 PM

叫你不看我Danmaku2ASS程序的源代码……
为了A站的JSON格式我研究了多少文档(包括高级弹幕)……

Avatar_small
依云 说:
Mar 04, 2014 10:17:28 PM

当然是因为没有 Google 到啦…………

Star Brilliant 说:
Mar 04, 2014 10:24:10 PM

乃竟然不订阅我的blog……真让我桑心……

Star Brilliant 说:
Mar 04, 2014 10:27:10 PM

我的Danmaku2ASS可以直接转换特效弹幕。如果歌词是用特效弹幕做的可以直接转。

Avatar_small
依云 说:
Mar 04, 2014 10:48:37 PM

我有订阅的啊。可是都三个多月了,忘记啦……

Avatar_small
依云 说:
Mar 05, 2014 12:06:27 AM

我用了 fontconfig 选项,为什么泰语字符还是显示不出来呀……

Avatar_small
依云 说:
Mar 05, 2014 12:11:58 AM

试过 ass 了,效果不错,但不是我想要的。我只要正常的字幕,不要到处飞的那种……

另外,有些字符还是不能显示 :-(

Avatar_small
依云 说:
Mar 05, 2014 12:28:58 AM

好像是要加 -ass 选项的?

Star Brilliant 说:
Mar 05, 2014 12:38:58 AM

Acfun的UP主设置的保护区弹幕是分开在 .lock.json 文件中的。
只转换那个文件就OK啦。

Avatar_small
依云 说:
Mar 05, 2014 12:41:12 AM

使用 libass 的时候,怎么指定默认样式呢?我希望让 libass 的默认样式和不使用 libass 时的一样,但是字幕文件可以覆盖掉。

muzuiget 说:
Mar 05, 2014 12:50:00 PM

我那个格式意义也是抄来的哈哈。

muzuiget 说:
Mar 05, 2014 12:58:39 PM

mplayer 使用 srt 格式得字幕的样式真是好难搞的,直接上 libass 吧。可以用 smplayer,用 GUI 配置样式,其实它也是自动把 srt 转换成 ass 来处理的。样式头是文件是 ~/.config/smplayer/style.ass 所以你在 smplayer 里用 libass,并调整好样式。然后再把 srt 转成 ass,接着手动修改样式头就能在 mplayer 里播放了(奇怪的用法)。不过我现在熟悉 ass 格式,所以都直接修改了。

Star Brilliant 说:
Mar 05, 2014 03:53:00 PM

用FFmpeg转换字幕格式:ffmpeg -i input.srt output.ass

MPlayer控制ASS样式相关选项参考SMPlayer。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

部分静态文件存储由又拍云存储提供。 | Theme: Aeros 2.0 by TheBuckmaker.com