-
Notifications
You must be signed in to change notification settings - Fork 417
Description
IMPORTANT: Be sure to replace all template sections {{ like this }} or your issue may be discarded.
Overview
I need to either entirely demux a subtitle stream from a video container so that I can put it into e.g. an .ass file and it will be valid ass, or transcode a subtitle into a fixed target format like .srt and output that into a valid file.
I thus tried opening a video file and decoding its subtitle stream (ass) and encoding it into a new file with a .srt stream:
import av
cont=av.open("D:/test.mp4")
cont2=av.open('d:/test.srt', 'w')
srtstream = cont2.add_stream('srt')
assframes = cont.decode(subtitles=1)
for f in assframes:
srtpackets = srtstream.encode(f)
cont2.mux(srtpackets)
cont2.close()
Expected behavior
I expected calling container.decode() returning frames.
Actual behavior
When decoding a subtitle stream though, its instead returning SubtitleSet objects, which the stream encoder doesn't know to convert them to actual frames.
Traceback:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\scripts\loudspeaker\test.py", line 10, in <module>
srtpackets = srtstream.encode(f)
File "av\stream.pyx", line 152, in av.stream.Stream.encode
TypeError: Cannot convert av.subtitles.subtitle.SubtitleSet to av.frame.Frame
Investigation
I tried decoding the subtitle stream itself, like this:
substream = cont.streams.subtitles[1]
frames = substream.decode()
That however crashes the interpreter silently.
I thought about taking the, I suppose, frames, which can be found in SubtitleSet.rects, and simply writing them to a file one by one, but I don't know if that will actually give a correct .ass file in the end.
So is there a way to get either a valid .ass file (demux the ass stream from my container) or, even better, transcode the ass subtitle into a srt one?
Research
I have done the following:
- Checked the PyAV documentation
- Searched on Google
- Searched on Stack Overflow
- Looked through old GitHub issues
- Asked on PyAV Gitter
- ... and waited 72 hours for a response.