From 8846c35b1bbb9c8cee4219dd01e9f0b49c81248e Mon Sep 17 00:00:00 2001 From: Thulinma Date: Fri, 28 Jun 2024 23:43:01 +0200 Subject: [PATCH] Change metadata to make afreecatv happy --- lib/flv_tag.cpp | 80 ++++++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 37 deletions(-) diff --git a/lib/flv_tag.cpp b/lib/flv_tag.cpp index 97d8ccfc..1a4c96e9 100644 --- a/lib/flv_tag.cpp +++ b/lib/flv_tag.cpp @@ -496,6 +496,7 @@ bool FLV::Tag::DTSCAudioInit(const std::string & codec, unsigned int sampleRate, bool FLV::Tag::DTSCMetaInit(const DTSC::Meta &M, std::set &selTracks){ AMF::Object amfdata("root", AMF::AMF0_DDV_CONTAINER); + amfdata.addContent(AMF::Object("", "@setDataFrame")); amfdata.addContent(AMF::Object("", "onMetaData")); amfdata.addContent(AMF::Object("", AMF::AMF0_ECMA_ARRAY)); AMF::Object trinfo = AMF::Object("trackinfo", AMF::AMF0_STRICT_ARRAY); @@ -505,77 +506,82 @@ bool FLV::Tag::DTSCMetaInit(const DTSC::Meta &M, std::set &selTracks){ if (M.getDuration(*it) > mediaLen){mediaLen = M.getDuration(*it);} if (M.getType(*it) == "video"){ trinfo.addContent(AMF::Object("", AMF::AMF0_OBJECT)); - trinfo.getContentP(i)->addContent(AMF::Object( - "length", ((double)M.getDuration(*it) / 1000) * ((double)M.getFpks(*it) / 1000.0), AMF::AMF0_NUMBER)); - trinfo.getContentP(i)->addContent(AMF::Object("timescale", ((double)M.getFpks(*it) / 1000), AMF::AMF0_NUMBER)); trinfo.getContentP(i)->addContent(AMF::Object("sampledescription", AMF::AMF0_STRICT_ARRAY)); - amfdata.getContentP(1)->addContent(AMF::Object("hasVideo", 1, AMF::AMF0_BOOL)); + AMF::Object * sampDesc = trinfo.getContentP(i)->getContentP(0); + if (M.getVod()){ + trinfo.getContentP(i)->addContent(AMF::Object( "length", ((double)M.getDuration(*it) / 1000) * ((double)M.getFpks(*it) / 1000.0), AMF::AMF0_NUMBER)); + } + trinfo.getContentP(i)->addContent(AMF::Object("timescale", ((double)M.getFpks(*it) / 1000), AMF::AMF0_NUMBER)); + amfdata.getContentP(2)->addContent(AMF::Object("hasVideo", 1, AMF::AMF0_BOOL)); std::string codec = M.getCodec(*it); if (codec == "H264"){ - amfdata.getContentP(1)->addContent(AMF::Object("videocodecid", 7, AMF::AMF0_NUMBER)); - trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", "avc1")); + amfdata.getContentP(2)->addContent(AMF::Object("videocodecid", 7, AMF::AMF0_NUMBER)); + sampDesc->addContent(AMF::Object("sampletype", "avc1")); } if (codec == "ScreenVideo2"){ - amfdata.getContentP(1)->addContent(AMF::Object("videocodecid", 6, AMF::AMF0_NUMBER)); - trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", "sv2")); + amfdata.getContentP(2)->addContent(AMF::Object("videocodecid", 6, AMF::AMF0_NUMBER)); + sampDesc->addContent(AMF::Object("sampletype", "sv2")); } if (codec == "VP6Alpha"){ - amfdata.getContentP(1)->addContent(AMF::Object("videocodecid", 5, AMF::AMF0_NUMBER)); - trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", "vp6a")); + amfdata.getContentP(2)->addContent(AMF::Object("videocodecid", 5, AMF::AMF0_NUMBER)); + sampDesc->addContent(AMF::Object("sampletype", "vp6a")); } if (codec == "VP6"){ - amfdata.getContentP(1)->addContent(AMF::Object("videocodecid", 4, AMF::AMF0_NUMBER)); - trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", "vp6")); + amfdata.getContentP(2)->addContent(AMF::Object("videocodecid", 4, AMF::AMF0_NUMBER)); + sampDesc->addContent(AMF::Object("sampletype", "vp6")); } if (codec == "ScreenVideo1"){ - amfdata.getContentP(1)->addContent(AMF::Object("videocodecid", 3, AMF::AMF0_NUMBER)); - trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", "sv1")); + amfdata.getContentP(2)->addContent(AMF::Object("videocodecid", 3, AMF::AMF0_NUMBER)); + sampDesc->addContent(AMF::Object("sampletype", "sv1")); } if (codec == "H263"){ - amfdata.getContentP(1)->addContent(AMF::Object("videocodecid", 2, AMF::AMF0_NUMBER)); - trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", "h263")); + amfdata.getContentP(2)->addContent(AMF::Object("videocodecid", 2, AMF::AMF0_NUMBER)); + sampDesc->addContent(AMF::Object("sampletype", "h263")); } if (codec == "JPEG"){ - amfdata.getContentP(1)->addContent(AMF::Object("videocodecid", 1, AMF::AMF0_NUMBER)); - trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", "jpeg")); + amfdata.getContentP(2)->addContent(AMF::Object("videocodecid", 1, AMF::AMF0_NUMBER)); + sampDesc->addContent(AMF::Object("sampletype", "jpeg")); } - amfdata.getContentP(1)->addContent(AMF::Object("width", M.getWidth(*it), AMF::AMF0_NUMBER)); - amfdata.getContentP(1)->addContent(AMF::Object("height", M.getHeight(*it), AMF::AMF0_NUMBER)); - amfdata.getContentP(1)->addContent( + amfdata.getContentP(2)->addContent(AMF::Object("width", M.getWidth(*it), AMF::AMF0_NUMBER)); + amfdata.getContentP(2)->addContent(AMF::Object("height", M.getHeight(*it), AMF::AMF0_NUMBER)); + amfdata.getContentP(2)->addContent( AMF::Object("videoframerate", (double)M.getFpks(*it) / 1000.0, AMF::AMF0_NUMBER)); - amfdata.getContentP(1)->addContent( + amfdata.getContentP(2)->addContent( AMF::Object("videodatarate", (double)M.getBps(*it) / 128.0, AMF::AMF0_NUMBER)); ++i; } if (M.getType(*it) == "audio"){ trinfo.addContent(AMF::Object("", AMF::AMF0_OBJECT)); - trinfo.getContentP(i)->addContent( - AMF::Object("length", (double)(M.getDuration(*it) * M.getRate(*it)), AMF::AMF0_NUMBER)); - trinfo.getContentP(i)->addContent(AMF::Object("timescale", M.getRate(*it), AMF::AMF0_NUMBER)); trinfo.getContentP(i)->addContent(AMF::Object("sampledescription", AMF::AMF0_STRICT_ARRAY)); - amfdata.getContentP(1)->addContent(AMF::Object("hasAudio", 1, AMF::AMF0_BOOL)); - amfdata.getContentP(1)->addContent(AMF::Object("audiodelay", 0.0, AMF::AMF0_NUMBER)); + AMF::Object * sampDesc = trinfo.getContentP(i)->getContentP(0); + if (M.getVod()){ + trinfo.getContentP(i)->addContent( + AMF::Object("length", (double)(M.getDuration(*it) * M.getRate(*it)), AMF::AMF0_NUMBER)); + } + trinfo.getContentP(i)->addContent(AMF::Object("timescale", M.getRate(*it), AMF::AMF0_NUMBER)); + amfdata.getContentP(2)->addContent(AMF::Object("hasAudio", 1, AMF::AMF0_BOOL)); + amfdata.getContentP(2)->addContent(AMF::Object("audiodelay", 0.0, AMF::AMF0_NUMBER)); std::string codec = M.getCodec(*it); if (codec == "AAC"){ - amfdata.getContentP(1)->addContent(AMF::Object("audiocodecid", "mp4a")); - trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", "mp4a")); + amfdata.getContentP(2)->addContent(AMF::Object("audiocodecid", "mp4a")); + sampDesc->addContent(AMF::Object("sampletype", "mp4a")); } if (codec == "MP3"){ - amfdata.getContentP(1)->addContent(AMF::Object("audiocodecid", "mp3")); - trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", "mp3")); + amfdata.getContentP(2)->addContent(AMF::Object("audiocodecid", "mp3")); + sampDesc->addContent(AMF::Object("sampletype", "mp3")); } - amfdata.getContentP(1)->addContent(AMF::Object("audiochannels", M.getChannels(*it), AMF::AMF0_NUMBER)); - amfdata.getContentP(1)->addContent(AMF::Object("audiosamplerate", M.getRate(*it), AMF::AMF0_NUMBER)); - amfdata.getContentP(1)->addContent(AMF::Object("audiosamplesize", M.getSize(*it), AMF::AMF0_NUMBER)); - amfdata.getContentP(1)->addContent( + amfdata.getContentP(2)->addContent(AMF::Object("audiochannels", M.getChannels(*it), AMF::AMF0_NUMBER)); + amfdata.getContentP(2)->addContent(AMF::Object("audiosamplerate", M.getRate(*it), AMF::AMF0_NUMBER)); + amfdata.getContentP(2)->addContent(AMF::Object("audiosamplesize", M.getSize(*it), AMF::AMF0_NUMBER)); + amfdata.getContentP(2)->addContent( AMF::Object("audiodatarate", (double)M.getBps(*it) / 128.0, AMF::AMF0_NUMBER)); ++i; } } if (M.getVod()){ - amfdata.getContentP(1)->addContent(AMF::Object("duration", mediaLen / 1000.0, AMF::AMF0_NUMBER)); + amfdata.getContentP(2)->addContent(AMF::Object("duration", mediaLen / 1000.0, AMF::AMF0_NUMBER)); } - amfdata.getContentP(1)->addContent(trinfo); + //amfdata.getContentP(2)->addContent(trinfo); std::string tmp = amfdata.Pack(); len = tmp.length() + 15;