[FFmpeg-devel] [PATCH v2] libavformat/webvttenc: Allow (but discard) additional streams

Soft Works softworkz at hotmail.com
Tue Sep 17 04:25:49 EEST 2019


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 <softworkz at 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



More information about the ffmpeg-devel mailing list