This allows mapping a video stream as reference stream for creating vtt 
segments when using the segment muxer. Example:

ffmpeg -i INPUT -map 0:3 -c:0 webvtt -map 0:0 -c:v:0 copy -f segment 
-segment_format webvtt -segment_time 6 -write_empty_segments 1 -y 
"sub_segment3%d.vtt"

The mpegts segments are being created in a constant and regular way. But not 
necessearily in the case of subtitles: When hitting a time range without any 
subtitle event, the segmenter stops generating subtitle segments, even when 
write_empty_segments is configured.
It's not that write_empty_segments would not be working, though: As soon as a 
new subtitle event reaches the muxer, it catches up by creating the missed 
empty segments all at once. This might be OK for precreating content for 
HLS/VOD scenarios but it's a behavioral bug when you rely on having accurate 
results while the process is running.

This is happening because When there are no subtitle events, there are no 
packets arriving at the segment muxer (for vtt).

This patch allows a video stream as input to the WebVTT muxer which is 
discarded - but will allow the segment muxer to use it as reference stream.

Signed-off-by: softworkz <softwo...@hotmail.com>
---
 libavformat/webvttenc.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/libavformat/webvttenc.c b/libavformat/webvttenc.c
index 61b7f54622..be85c03130 100644
--- a/libavformat/webvttenc.c
+++ b/libavformat/webvttenc.c
@@ -49,8 +49,8 @@ static int webvtt_write_header(AVFormatContext *ctx)
     AVCodecParameters *par = ctx->streams[0]->codecpar;
     AVIOContext *pb = ctx->pb;
 
-    if (ctx->nb_streams != 1 || par->codec_id != AV_CODEC_ID_WEBVTT) {
-        av_log(ctx, AV_LOG_ERROR, "Exactly one WebVTT stream is needed.\n");
+    if (par->codec_id != AV_CODEC_ID_WEBVTT) {
+        av_log(ctx, AV_LOG_ERROR, "First stream must be WebVTT.\n");
         return AVERROR(EINVAL);
     }
 
@@ -68,6 +68,9 @@ static int webvtt_write_packet(AVFormatContext *ctx, AVPacket 
*pkt)
     int id_size, settings_size;
     uint8_t *id, *settings;
 
+    if (pkt->stream_index != 0)
+        return 0;
+
     avio_printf(pb, "\n");
 
     id = av_packet_get_side_data(pkt, AV_PKT_DATA_WEBVTT_IDENTIFIER,
-- 
2.17.1.windows.2

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to