Am 04.10.24 um 12:09 schrieb Steven Liu:
Jonathan Baecker <jonba...@gmail.com> 于2024年9月29日周日 05:56写道:
If 'sname:*' is set in the var_stream_map variable, use it as
the NAME attribute for subtitles. This improves the naming of
subtitle streams in HTML players, providing clearer and more
descriptive labels for users.
---
  doc/muxers.texi           | 5 +++--
  libavformat/hlsenc.c      | 7 ++++++-
  libavformat/hlsplaylist.c | 9 +++++++--
  libavformat/hlsplaylist.h | 2 +-
  4 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/doc/muxers.texi b/doc/muxers.texi
index ce93ba1488..04b7f20b7e 100644
--- a/doc/muxers.texi
+++ b/doc/muxers.texi
@@ -2436,13 +2436,14 @@ ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k \
  @item
  Create a single variant stream. Add the @code{#EXT-X-MEDIA} tag with
  @code{TYPE=SUBTITLES} in the master playlist with webvtt subtitle group name
-'subtitle'. Make sure the input file has one text subtitle stream at least.
+'subtitle' and optional subtitle name, e.g. 'English'. Make sure the input
+file has one text subtitle stream at least.
  @example
  ffmpeg -y -i input_with_subtitle.mkv \
   -b:v:0 5250k -c:v h264 -pix_fmt yuv420p -profile:v main -level 4.1 \
   -b:a:0 256k \
   -c:s webvtt -c:a mp2 -ar 48000 -ac 2 -map 0:v -map 0:a:0 -map 0:s:0 \
- -f hls -var_stream_map "v:0,a:0,s:0,sgroup:subtitle" \
+ -f hls -var_stream_map "v:0,a:0,s:0,sgroup:subtitle,sname:English" \
   -master_pl_name master.m3u8 -t 300 -hls_time 10 -hls_init_time 4 
-hls_list_size \
   10 -master_pl_publish_rate 10 -hls_flags \
   delete_segments+discont_start+split_by_time ./tmp/video.m3u8
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index 1e932b7b0e..7b2145f5bf 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -189,6 +189,7 @@ typedef struct VariantStream {
      const char *sgroup;   /* subtitle group name */
      const char *ccgroup;  /* closed caption group name */
      const char *varname;  /* variant name */
+    const char *subtitle_varname;  /* subtitle variant name */
  } VariantStream;

  typedef struct ClosedCaptionsStream {
@@ -1533,7 +1534,8 @@ static int create_master_playlist(AVFormatContext *s,
                  break;
              }

-            ff_hls_write_subtitle_rendition(hls->m3u8_out, sgroup, vtt_m3u8_rel_name, 
vs->language, i, hls->has_default_key ? vs->is_default : 1);
+            ff_hls_write_subtitle_rendition(hls->m3u8_out, sgroup, 
vtt_m3u8_rel_name, vs->language,
+                    vs->subtitle_varname, i, hls->has_default_key ? 
vs->is_default : 1);
          }

          if (!hls->has_default_key || !hls->has_video_m3u8) {
@@ -2107,6 +2109,9 @@ static int parse_variant_stream_mapstring(AVFormatContext 
*s)
              } else if (av_strstart(keyval, "name:", &val)) {
                  vs->varname  = val;
                  continue;
+            } else if (av_strstart(keyval, "sname:", &val)) {
+                vs->subtitle_varname  = val;
+                continue;
              } else if (av_strstart(keyval, "agroup:", &val)) {
                  vs->agroup   = val;
                  continue;
diff --git a/libavformat/hlsplaylist.c b/libavformat/hlsplaylist.c
index f8a6977702..17b93a5ef1 100644
--- a/libavformat/hlsplaylist.c
+++ b/libavformat/hlsplaylist.c
@@ -57,13 +57,18 @@ void ff_hls_write_audio_rendition(AVIOContext *out, const 
char *agroup,

  void ff_hls_write_subtitle_rendition(AVIOContext *out, const char *sgroup,
                                       const char *filename, const char 
*language,
-                                     int name_id, int is_default)
+                                     const char *sname, int name_id, int 
is_default)
  {
      if (!out || !filename)
          return;

      avio_printf(out, "#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID=\"%s\"", sgroup);
-    avio_printf(out, ",NAME=\"subtitle_%d\",DEFAULT=%s,", name_id, is_default ? "YES" : 
"NO");
+    if (sname) {
+        avio_printf(out, ",NAME=\"%s\",", sname);
+    } else {
+        avio_printf(out, ",NAME=\"subtitle_%d\",", name_id);
+    }
+    avio_printf(out, "DEFAULT=%s,", is_default ? "YES" : "NO");
      if (language) {
          avio_printf(out, "LANGUAGE=\"%s\",", language);
      }
diff --git a/libavformat/hlsplaylist.h b/libavformat/hlsplaylist.h
index d7aa44d8dc..ec44e5a0ae 100644
--- a/libavformat/hlsplaylist.h
+++ b/libavformat/hlsplaylist.h
@@ -41,7 +41,7 @@ void ff_hls_write_audio_rendition(AVIOContext *out, const 
char *agroup,
                                    int name_id, int is_default, int 
nb_channels);
  void ff_hls_write_subtitle_rendition(AVIOContext *out, const char *sgroup,
                                       const char *filename, const char 
*language,
-                                     int name_id, int is_default);
+                                     const char *sname, int name_id, int 
is_default);
  void ff_hls_write_stream_info(AVStream *st, AVIOContext *out, int bandwidth,
                                int avg_bandwidth,
                                const char *filename, const char *agroup,
--
2.46.1

_______________________________________________
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".
The modified api looks only be used by hlsenc, and it looks fine to me.
Will apply after 48 hours if there have no more comments.


Thanks
Steven


Hi Steven,

sorry to be a pain, but you said you wanted to merge this patch
and the other two regarding avformat/hlsenc.

Thanks in advance!
Jonathan


_______________________________________________
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