YLE DVB tekstit -> BD PGS tekstit

VDR ja DVB aiheista keskustelua
johu
Vastasyntynyt
Viestit: 2
Liittynyt: 09.06.2012 16:36

YLE DVB tekstit -> BD PGS tekstit

Viesti Kirjoittaja johu » 09.06.2012 17:08

Sama postattu DVBTechnics forumille pari päivää sitten, mutta laitetaan tännekin josko jollekin iloa. Kyse siis siitä iänikuisista ongelmasta konvertoida DVB tekstejä VobSub muotoon. Tämä viritelmä vääntää niistä BluRay PGS formaatissa olevia jolloin ei ongelmaa värien kanssa. Yhteensopivuuden nimissä tekee myös VobSub tekstejä samalla metodilla. Sekä PGS että VobSub konversio toimii Ylen vanhoilla ja nykyisillä teksteillä sekä muilla kotimaisilla DVB tekstejä käyttävillä kanavilla. HD kanavia ei oikein näy joten miten käyttäytyy niiden kanssa testaamatta.

Lopputuloksen voi muksata vaikka MKV tiedostoon siten että molemmat PGS ja VobSub tekstit mukana. PGS muotoisia tekstejä tukee ainakin mkvtoolnix (mkvmerge), VLC, XBMC sekä uusimmat Handbrake:n versiot.

Raskaan työn tekee Project X, BDSup2Sub, ImageMagick sekä mkvtoolnix eli kaikki kunnia sinne.

Alla Project X:n ini-tiedosto, tuo scriptihärdellini sekä esimerkkikomennot millä VDR:llä tehty TV1 tallenne jossa myös tekstitv päällä muuttuu MKV tiedostoksi sisältäen PGS, VobSub ja SRT tekstit.

Opensource OCR:t (tesseract mukaanlukien) tökkää pahasti italics versioon DVB teksteissä joten OCR osuutta ei tässä ole. OCR tilannetta voi parantaa vähän kallistamalla tekstiä vasemmalle jolloin normiteksti kaatuu vasemmalle mutta yhä OCR:n tulkittavissa ja italics suoristuu jolloin senkin lukeminen alkaa onnistua. Turhaa purkkaa kuitenkin koska itselleni riittää että tekstit toimii, ei niiden tarvitse SRT muodossa olla.

X.ini for Project X

Koodi: Valitse kaikki

# ExportPanel
ExportPanel.Streamtype.Ac3Audio=1
ExportPanel.Streamtype.MpgAudio=1
ExportPanel.Streamtype.MpgVideo=1
ExportPanel.Streamtype.PcmAudio=1
ExportPanel.Streamtype.Teletext=1
ExportPanel.Streamtype.Subpicture=1
ExportPanel.Streamtype.Vbi=0

SubtitlePanel.SubpictureColorModel=(2) 256 colours
SubtitlePanel.SubtitleExportFormat=SRT
SubtitlePanel.SubtitleExportFormat_2=SON
SubtitlePanel.enableHDSub=1
SubtitlePanel.exportAsVobSub=1
SubtitlePanel.TtxPage1=451
SubtitlePanel.rebuildPTS=1

Script to generate PGS (Bluray) and VobSub (DVD) subtitles from BMP images exported using Project X.

Koodi: Valitse kaikki

#!/bin/bash

# There ain't much error checks so beware!
if [ "$2". = "". ]
then
 echo -e "\nWhoopsie! Missing parameters!\n"
 echo -e "Usage:  `basename $0` myproject myproject-subs1 pgs 1\n"
 echo -e "myproject       = name used when demuxing with ProjectX"
 echo -e "myproject-subs1 = output prefix for subtitles"
 echo -e "pgs             = export either pgs (BluRay 256 color) or"
 echo -e "                    vbs (VobSub 4 color) subtitles"
 echo -e "                    (optional, defaults to vbs)"
 echo -e "1               = subtitle stream number from ProjectX"
 echo -e "                    (optional, defaults to 1)\n\n"
 exit 0
fi

# Optionally specify full path to JRE
#java="java"
java="`which java`"

# Check that Java Runtime is installed
if [ "$java". = "". ]
then
 echo "Java JRE is missing - Aborting"
 exit 0
fi

# Path to BDSup2Sub
# Download latest version from http://sw-planet.blogspot.com/2012/02/bdsup2sub-401.html
bdsup2sub="/usr/src/bdsup2sub/BDSup2Sub.jar"

# Abort if BDSup2Sub missing
if [ ! -e "${bdsup2sub}" ]
then
 echo "Can't find BDSup2Sub - Aborting"
 exit 0
fi

# Source without suffix so "myproject.sup.idx" is just "myproject"
source="$1"

# Abort if source missing
if [ ! -e "${source}.sup.idx" ]
then
 echo "Can't find ${source}.sup.idx - Aborting"
 exit 0
fi

# Destination, for example "myproject1"
# If there's more than one subpicture stream this needs to be unique for each
project="$2"

# Source and destination can't be same
if [ "$source" = "$project" ]
then
 echo "Identical source and destination names - Aborting"
 exit 0
fi

# Type of subpictures to create
# vbs = DVD VobSub idx+sub, 4 colors
# pgs = BluRay PGS subtitles, 256 colors
# Uses vbs if not specified
if [ "$3". = "". ]
then
 subtype="vbs"
else
 subtype="$3"
fi

# Validate subtype
if [ ! "${subtype}" = "pgs" ] && [ ! "${subtype}" = "vbs" ]
then
 echo "Bad subtype, use pgs or vbs"
 exit 0
fi

# Subpicture stream to process
# 1 if only one subpicture stream present
if [ "$4". = "". ]
then
 substream="1"
else
 substream="$4"
fi

# Abort if SON missing
if [ ! -e "${source}.son" ]
then
 echo "Can't find ${source}.son - Aborting"
 exit 0
fi

# Get number of subpictures from SON
count=`grep -c "\.bmp$" ${source}.son`

# Abort if no subs
if [ "${count}". = "". ]
then
 echo "No subpictures found - Aborting"
 exit 0
else
 if [ ${count} -lt 1 ]
 then
  echo "Zero subpictures found - Aborting"
  exit 0
 fi
fi

# Check that convert from ImageMagick is installed
if [ "`which convert`". = "". ]
then
 echo "ImageMagick convert missing - Aborting"
 exit 0
fi

# Cleanup
rm -f "${project}.xml" \
      "${project}"_????.png

# Extract timing info from VobSub.
# For some reason timings are slightly different than SON file
# We're using VobSub timings. You could also convert SON to BDSup2Sub compatible XML
"${java}" -Djava.awt.headless=true -jar "${bdsup2sub}" "${source}.sup.idx" "${project}.xml"

# Abort if XML missing
if [ ! -e "${project}.xml" ]
then
 echo "Can't find ${project}.xml - Aborting"
 exit 0
fi

# Remove unneeded PNG images created by BDSup2Sub, we only want XML part
rm -f "${project}"_????.png

# For VobSub subs we remap colors using colormap.
# You can also provide your own colormap and comment this out.
if [ "${subtype}" = "vbs" ]
then
 echo "Using DVD VobSub subtitles"
 subfile="${project}.idx"
 echo "Creating remap.png for color conversion"
 # Create colormap. 999998 is mapped to 999999 by BDSup2Sub and 999999 is
 # mapped to f0f0f0 by BDSup2Sub, therefore we're going to use 999998 instead.
 convert -size 10x40 \
         xc:none \
         -fill '#000000' -draw 'rectangle 0,0   10,10' \
         -fill none      -draw 'rectangle 0,10  10,20' \
         -fill '#f0f0f0' -draw 'rectangle 0,20  10,30' \
         -fill '#999998' -draw 'rectangle 0,30  10,40' \
         -matte \
         png8:remap.png
 # Abort if remap.png missing
 if [ ! -e "remap.png" ]
 then
  echo "Can't create remap.png - Aborting"
  exit 0
 fi
else
 echo "Using BluRay PGS subtitles"
 subfile="${project}.sup"
fi

# Cleanup
rm -f "${subfile}"

# Loop thru all files and convert them to PNG
for (( i=0; i<${count} ; ))
do
 bmp="${source}""_st$(printf %05d ${i%.png})p${substream}.bmp"
 # Abort if source bmp missing
 if [ ! -e "$bmp" ]
 then
  echo "Can't find $bmp - Aborting"
  exit 0
 fi
 let i++ 
 png="${project}_""$(printf %04d ${i%.png}).png"
 echo -n "Converting ${bmp} to ${png} - "
 if [ "${subtype}" = "vbs" ]
 then
  # Convert BMP with blue background to transparent PNG using only colors from
  # remap.png. Disable dithering. Adjust levels to fix PC/TV colorspace
  # differences?
  convert \
          -transparent "#000060" \
          +dither \
          -level "10%,95%" \
          -remap remap.png \
          "${bmp}" \
          "${png}"
  echo "DONE"
 else
  # Convert BMP with blue background to transparent PNG keeping all colors.
  # Adjust levels to fix PC/TV colorspace differences?
  convert \
          -transparent "#000060" \
          -level "10%,95%" \
          "${bmp}" \
          "${png}"
  echo "DONE"
 fi
 # Abort if target png missing
 if [ ! -e "$png" ]
 then
  echo "Can't create $png - Aborting"
  exit 0
 fi
done

# Convert XML+BMP to BD PGS or DVD VobSub
"${java}" -Djava.awt.headless=true -jar "${bdsup2sub}" "${project}.xml" "${subfile}"

# Abort if subfile creation failed
if [ ! -e "${subfile}" ]
then
 echo "Can't create ${subfile} - Aborting"
 exit 0
fi

# VobSub default language is set to DE
# This is not always true so we clear this flag
# Languages can be set with mkvmerge parameters later on
if [ "${subtype}" = "vbs" ]
then
 echo "Removing default DE language code from VobSub"
 sed -i -e's|^id: de,|id: --,|g' "${subfile}"
fi

# Cleanup
rm -f "remap.png" \
      "${project}"_????.png \
      "${project}".xml
      
# Done
echo -e "\nSubtitles saved as ${subfile}\n"

Demux TS recorded with VDR

Koodi: Valitse kaikki

java \
     -Djava.awt.headless=true \
     -jar /usr/src/px2/ProjectX.jar \
     -ini X.ini \
     -name myproject \
     -out /tmp/myproject \
     -demux \
     /tmp/YLE1_00001.ts

Generate PGS subtitles

Koodi: Valitse kaikki

/tmp/myproject/subfoo.sh myproject myproject-subs pgs

Generate VobSub subtitles

Koodi: Valitse kaikki

/tmp/myproject/subfoo.sh myproject myproject-subs

Mux as MKV with PGS, VobSub and SRT subtitles

Koodi: Valitse kaikki

mkvmerge -o myproject.mkv \
         --language 0:eng myproject.m2v \
         --language 0:eng myproject.mp2 \
         --language 0:fin myproject-subs.sup \
         --language 0:fin myproject-subs.idx \
         --language 0:fin "myproject[451].srt"

Example of results. PGS subs are bit dim, might be wise to adjust levels parameter of convert bit. These are old style YLE subtitles from old test recording I made back in 2008.

Kuva


This is how it looks with current YLE subtitling font.

Kuva

domo
Vastasyntynyt
Viestit: 5
Liittynyt: 01.08.2007 11:42
Viesti:

Re: YLE DVB tekstit -> BD PGS tekstit

Viesti Kirjoittaja domo » 07.07.2012 16:56

Tosi hyvä juttu -- etsin tuossa juuri joitakin päiviä sitten jotain vastaavaa
mutta en oikein mitään (nopeata) intternet-suosta löytänyt.

Hyvin näyttää toimivan, jotain

[matroska,webm @ 0x3b5f2e5c40]Unknown entry 0xA4

"ongelmia" esiintyy (juuri minulla) kun toistaa mplayerilla/ffmplaylla -- pitää
selvitellä -- ei näy kuvassa/äänessä/teksteissä mutta ärsyttää...

Tunkkasin noista itselleni sopivan scriptin,

http://www.iki.fi/too/sw/m2vmp2cut/ts2mkv.sh

, josko siitä olisi muillekin iloa...

Vastaa Viestiin