2010-07-03 14 views
7

Ich benutze derzeit ffmpeg, um Videos in verschiedenen Formaten in FLV-Dateien zu konvertieren. Eine Anfrage ist ebenfalls eingegangen und das ist, um Informationen über Untertitel aus der Datei zu erhalten. Hat jemand irgendwelche Erfahrungen damit oder weiß, dass es sogar getan werden kann. Ich sehe keine Optionen dafür, dachte aber, ich würde fragen und sehen.Kann ffmpeg extrahieren Untertitel Daten

Antwort

1

Wenn die Beschriftung als separater Strom enthalten sind, dann Extrahieren sie ist (relativ) einfach:

ffmpeg -i input.mov -an -vn -c:s copy -f rawvideo -map 0:s sub.txt 

Wenn es auf der Video-Datei „eingebrannt“ ist, dann sind Sie wahrscheinlich kein Glück, aber ich würde das häufiger für Untertitel als Untertitel tun.

2

Für nur die Untertitel bekommen und keine Meta-Junk, ich habe das für mich

ffmpeg -i input.mov -an -vn -bsf:s mov2textsub -scodec copy -f rawvideo sub.txt 

funktioniert am besten gefunden.

+0

Danke Heshy. Ich werde versuchen, es zu versuchen. Das Projekt ist jetzt weitergegangen, aber ich werde es notieren, wenn es zurückkommt. – spinon

1

Closed Captions sind keine separaten Streams, noch sind sie in das Bild eingebrannt, sie sind in Scanlines im Bild interlaced - das ist eine seltsame amerikanische Idee, nicht wirklich an anderer Stelle verwendet. Obwohl Sie DVDs kaufen können, die diese Art von Untertitel haben, können Leute außerhalb der USA die Untertitel normalerweise nicht sehen und wissen vielleicht nicht einmal, dass einige in der Datei sind.

CCExtractor diese Informationen von VOB des extrahieren kann, indem man die TS-Metadaten suchen: http://ccextractor.sourceforge.net/

+0

erscheint, dass für ATSC-Streams die Beschriftungen irgendwie "enthalten aber getrennt" sind und keine Bilder sind, also extrahierbar sind, siehe Anshuls Antwort. Nun, wenn ffmpeg sie "überlagern" kann und sie brennen, nicht sicher, aber zumindest Extraktion ist möglich ... – rogerdpack

6

Untertitel sind von 2-Format
1) ATSC amerikanischen Standard (Unterstützung gibt es in ffmpeg)
2) ISDB japanischen Standard (Unterstützung ist noch nicht da in ffmpeg)

Sie verwenden können, folgenden Befehl

ffmpeg -f lavfi -i "movie=test.ts[out0+subcc]" -map s output.srt 

Dieses Ding wurde vor kurzem entwickelt, also überprüfen Sie bitte Ihre Version von ffmpeg.

+0

Danke für die Entwicklung dieses Patches! – tmm1

10

Wenn jemand, wie ich, auf diesem Thread endet, hier ist ein bisschen detailliertere Erklärung auf ffmpeg Befehl, der für mich arbeitete.

ffmpeg -f lavfi -i movie=input.ts[out+subcc] -map 0:1 output.srt 

Es scheint eine harte Anforderung an Quelle mpegts Format (Dateierweiterung .ts) zu sein. Ansonsten scheint der lavfi Filter nicht zu funktionieren. Die Spezifikation out+subcc zwingt ffmpeg, geschlossene Untertitel (die in Rahmendaten eingebettet sind) als separaten Stream zu behandeln. Später -map 0:1 macht ffmpeg nur diesen Stream zuordnen und alles andere verwerfen. Das Ergebnis wird unter output.srt gespeichert. Abhängig von Ihrer Eingabe kann das Mapping unterschiedlich sein. Eine einfache Möglichkeit, die untertitel Mapping, um herauszufinden, ist ffprobe Befehl ausgeführt werden sollte, wie so

$ ffprobe -f lavfi -i movie=input.ts[out+subcc] 
ffprobe version N-79653-g4efd3ec Copyright (c) 2007-2016 the FFmpeg developers 
    libavutil  55. 22.101/55. 22.101 
    libavcodec  57. 38.100/57. 38.100 
    libavformat 57. 34.103/57. 34.103 
    libavdevice 57. 0.101/57. 0.101 
    libavfilter  6. 44.100/6. 44.100 
    libswscale  4. 1.100/4. 1.100 
    libswresample 2. 0.101/2. 0.101 
    libpostproc 54. 0.100/54. 0.100 
[h264 @ 0x7fe869826200] Increasing reorder buffer to 1 
Input #0, lavfi, from 'movie=input.ts[out+subcc]': 
    Duration: N/A, start: 1562.233011, bitrate: N/A 
    Stream #0:0: Video: rawvideo (I420/0x30323449), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 90k fps, 30 tbr, 90k tbn 
    Stream #0:1: Subtitle: eia_608 

Stream-Subtitle: eia_608 hat „index“ 0:1, so das ist, was abgebildet werden soll.

Wenige Trennzeichen, Reihenfolge der Argumente zählt für ffmpeg, -f lavfi muss vor -i move=... gehen, sonst wird die Spezifikation nicht erkannt. Auch diese Funktion ist ziemlich neu, also überprüfen Sie Ihre ffmpeg Version und aktualisieren Sie sie bei Bedarf.