Change metadata to make afreecatv happy
This commit is contained in:
parent
b9de1e1d90
commit
8846c35b1b
1 changed files with 43 additions and 37 deletions
|
@ -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<size_t> &selTracks){
|
bool FLV::Tag::DTSCMetaInit(const DTSC::Meta &M, std::set<size_t> &selTracks){
|
||||||
AMF::Object amfdata("root", AMF::AMF0_DDV_CONTAINER);
|
AMF::Object amfdata("root", AMF::AMF0_DDV_CONTAINER);
|
||||||
|
amfdata.addContent(AMF::Object("", "@setDataFrame"));
|
||||||
amfdata.addContent(AMF::Object("", "onMetaData"));
|
amfdata.addContent(AMF::Object("", "onMetaData"));
|
||||||
amfdata.addContent(AMF::Object("", AMF::AMF0_ECMA_ARRAY));
|
amfdata.addContent(AMF::Object("", AMF::AMF0_ECMA_ARRAY));
|
||||||
AMF::Object trinfo = AMF::Object("trackinfo", AMF::AMF0_STRICT_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<size_t> &selTracks){
|
||||||
if (M.getDuration(*it) > mediaLen){mediaLen = M.getDuration(*it);}
|
if (M.getDuration(*it) > mediaLen){mediaLen = M.getDuration(*it);}
|
||||||
if (M.getType(*it) == "video"){
|
if (M.getType(*it) == "video"){
|
||||||
trinfo.addContent(AMF::Object("", AMF::AMF0_OBJECT));
|
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));
|
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);
|
std::string codec = M.getCodec(*it);
|
||||||
if (codec == "H264"){
|
if (codec == "H264"){
|
||||||
amfdata.getContentP(1)->addContent(AMF::Object("videocodecid", 7, AMF::AMF0_NUMBER));
|
amfdata.getContentP(2)->addContent(AMF::Object("videocodecid", 7, AMF::AMF0_NUMBER));
|
||||||
trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", "avc1"));
|
sampDesc->addContent(AMF::Object("sampletype", "avc1"));
|
||||||
}
|
}
|
||||||
if (codec == "ScreenVideo2"){
|
if (codec == "ScreenVideo2"){
|
||||||
amfdata.getContentP(1)->addContent(AMF::Object("videocodecid", 6, AMF::AMF0_NUMBER));
|
amfdata.getContentP(2)->addContent(AMF::Object("videocodecid", 6, AMF::AMF0_NUMBER));
|
||||||
trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", "sv2"));
|
sampDesc->addContent(AMF::Object("sampletype", "sv2"));
|
||||||
}
|
}
|
||||||
if (codec == "VP6Alpha"){
|
if (codec == "VP6Alpha"){
|
||||||
amfdata.getContentP(1)->addContent(AMF::Object("videocodecid", 5, AMF::AMF0_NUMBER));
|
amfdata.getContentP(2)->addContent(AMF::Object("videocodecid", 5, AMF::AMF0_NUMBER));
|
||||||
trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", "vp6a"));
|
sampDesc->addContent(AMF::Object("sampletype", "vp6a"));
|
||||||
}
|
}
|
||||||
if (codec == "VP6"){
|
if (codec == "VP6"){
|
||||||
amfdata.getContentP(1)->addContent(AMF::Object("videocodecid", 4, AMF::AMF0_NUMBER));
|
amfdata.getContentP(2)->addContent(AMF::Object("videocodecid", 4, AMF::AMF0_NUMBER));
|
||||||
trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", "vp6"));
|
sampDesc->addContent(AMF::Object("sampletype", "vp6"));
|
||||||
}
|
}
|
||||||
if (codec == "ScreenVideo1"){
|
if (codec == "ScreenVideo1"){
|
||||||
amfdata.getContentP(1)->addContent(AMF::Object("videocodecid", 3, AMF::AMF0_NUMBER));
|
amfdata.getContentP(2)->addContent(AMF::Object("videocodecid", 3, AMF::AMF0_NUMBER));
|
||||||
trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", "sv1"));
|
sampDesc->addContent(AMF::Object("sampletype", "sv1"));
|
||||||
}
|
}
|
||||||
if (codec == "H263"){
|
if (codec == "H263"){
|
||||||
amfdata.getContentP(1)->addContent(AMF::Object("videocodecid", 2, AMF::AMF0_NUMBER));
|
amfdata.getContentP(2)->addContent(AMF::Object("videocodecid", 2, AMF::AMF0_NUMBER));
|
||||||
trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", "h263"));
|
sampDesc->addContent(AMF::Object("sampletype", "h263"));
|
||||||
}
|
}
|
||||||
if (codec == "JPEG"){
|
if (codec == "JPEG"){
|
||||||
amfdata.getContentP(1)->addContent(AMF::Object("videocodecid", 1, AMF::AMF0_NUMBER));
|
amfdata.getContentP(2)->addContent(AMF::Object("videocodecid", 1, AMF::AMF0_NUMBER));
|
||||||
trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", "jpeg"));
|
sampDesc->addContent(AMF::Object("sampletype", "jpeg"));
|
||||||
}
|
}
|
||||||
amfdata.getContentP(1)->addContent(AMF::Object("width", M.getWidth(*it), AMF::AMF0_NUMBER));
|
amfdata.getContentP(2)->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(2)->addContent(AMF::Object("height", M.getHeight(*it), AMF::AMF0_NUMBER));
|
||||||
amfdata.getContentP(1)->addContent(
|
amfdata.getContentP(2)->addContent(
|
||||||
AMF::Object("videoframerate", (double)M.getFpks(*it) / 1000.0, AMF::AMF0_NUMBER));
|
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));
|
AMF::Object("videodatarate", (double)M.getBps(*it) / 128.0, AMF::AMF0_NUMBER));
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
if (M.getType(*it) == "audio"){
|
if (M.getType(*it) == "audio"){
|
||||||
trinfo.addContent(AMF::Object("", AMF::AMF0_OBJECT));
|
trinfo.addContent(AMF::Object("", AMF::AMF0_OBJECT));
|
||||||
|
trinfo.getContentP(i)->addContent(AMF::Object("sampledescription", AMF::AMF0_STRICT_ARRAY));
|
||||||
|
AMF::Object * sampDesc = trinfo.getContentP(i)->getContentP(0);
|
||||||
|
if (M.getVod()){
|
||||||
trinfo.getContentP(i)->addContent(
|
trinfo.getContentP(i)->addContent(
|
||||||
AMF::Object("length", (double)(M.getDuration(*it) * M.getRate(*it)), AMF::AMF0_NUMBER));
|
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("timescale", M.getRate(*it), AMF::AMF0_NUMBER));
|
||||||
trinfo.getContentP(i)->addContent(AMF::Object("sampledescription", AMF::AMF0_STRICT_ARRAY));
|
amfdata.getContentP(2)->addContent(AMF::Object("hasAudio", 1, AMF::AMF0_BOOL));
|
||||||
amfdata.getContentP(1)->addContent(AMF::Object("hasAudio", 1, AMF::AMF0_BOOL));
|
amfdata.getContentP(2)->addContent(AMF::Object("audiodelay", 0.0, AMF::AMF0_NUMBER));
|
||||||
amfdata.getContentP(1)->addContent(AMF::Object("audiodelay", 0.0, AMF::AMF0_NUMBER));
|
|
||||||
std::string codec = M.getCodec(*it);
|
std::string codec = M.getCodec(*it);
|
||||||
if (codec == "AAC"){
|
if (codec == "AAC"){
|
||||||
amfdata.getContentP(1)->addContent(AMF::Object("audiocodecid", "mp4a"));
|
amfdata.getContentP(2)->addContent(AMF::Object("audiocodecid", "mp4a"));
|
||||||
trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", "mp4a"));
|
sampDesc->addContent(AMF::Object("sampletype", "mp4a"));
|
||||||
}
|
}
|
||||||
if (codec == "MP3"){
|
if (codec == "MP3"){
|
||||||
amfdata.getContentP(1)->addContent(AMF::Object("audiocodecid", "mp3"));
|
amfdata.getContentP(2)->addContent(AMF::Object("audiocodecid", "mp3"));
|
||||||
trinfo.getContentP(i)->getContentP(2)->addContent(AMF::Object("sampletype", "mp3"));
|
sampDesc->addContent(AMF::Object("sampletype", "mp3"));
|
||||||
}
|
}
|
||||||
amfdata.getContentP(1)->addContent(AMF::Object("audiochannels", M.getChannels(*it), AMF::AMF0_NUMBER));
|
amfdata.getContentP(2)->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(2)->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(2)->addContent(AMF::Object("audiosamplesize", M.getSize(*it), AMF::AMF0_NUMBER));
|
||||||
amfdata.getContentP(1)->addContent(
|
amfdata.getContentP(2)->addContent(
|
||||||
AMF::Object("audiodatarate", (double)M.getBps(*it) / 128.0, AMF::AMF0_NUMBER));
|
AMF::Object("audiodatarate", (double)M.getBps(*it) / 128.0, AMF::AMF0_NUMBER));
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (M.getVod()){
|
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();
|
std::string tmp = amfdata.Pack();
|
||||||
len = tmp.length() + 15;
|
len = tmp.length() + 15;
|
||||||
|
|
Loading…
Add table
Reference in a new issue