bool muxerMkv::open(const char *file, ADM_videoStream *s,uint32_t nbAudioTrack,ADM_audioStream **a) { /* All seems fine, open stuff */ if(false==setupMuxer("matroska",file)) { ADM_warning("[Mkv] Failed to open muxer (setup)\n"); return false; } if(initVideo(s)==false) { ADM_warning("[Mkv] Failed to init video\n"); return false; } AVCodecContext *c; c = video_st->codec; rescaleFps(s->getAvgFps1000(),&(c->time_base)); video_st->time_base=c->time_base; c->gop_size=15; if(true==mkvMuxerConfig.forceDisplayWidth && mkvMuxerConfig.displayWidth) { //sar=display/code int num=1,den=1; av_reduce(&num, &den, mkvMuxerConfig.displayWidth, s->getWidth(),65535); c->sample_aspect_ratio.num=num; c->sample_aspect_ratio.den=den; video_st->sample_aspect_ratio.num=num; video_st->sample_aspect_ratio.den=den; ADM_info("Forcing display width of %d\n",(int)mkvMuxerConfig.displayWidth); } if(initAudio(nbAudioTrack,a)==false) { ADM_warning("[Mkv] Failed to init audio\n"); return false; } // /audio int er = avio_open(&(oc->pb), file, AVIO_FLAG_WRITE); if (er) { ADM_error("[Mkv]: Failed to open file :%s, er=%d\n",file,er); return false; } AVDictionary *dict = NULL; char buf[64]; snprintf(buf, sizeof(buf), "%d", AV_TIME_BASE / 10); av_dict_set(&dict, "preload", buf, 0); av_dict_set(&dict, "max_delay", "200000", 0); av_dict_set(&dict, "muxrate", "10080000", 0); ADM_assert(avformat_write_header(oc, &dict) >= 0); ADM_info("Timebase codec = %d/%d\n",video_st->time_base.num,video_st->time_base.den); // ADM_info("Original timebase = %d/%d\n",myTimeBase.num,myTimeBase.den); vStream=s; aStreams=a; nbAStreams=nbAudioTrack; initialized=true; return true; }
bool muxerFlv::open(const char *file, ADM_videoStream *s,uint32_t nbAudioTrack,ADM_audioStream **a) { uint32_t fcc=s->getFCC(); bool r=true; char *fileTitle=NULL; if(fourCC::check(fcc,(uint8_t *)"FLV1") || isVP6Compatible(fcc)) { }else { GUI_Error_HIG("Unsupported","Only FLV1 & VP6 supported for video"); return false; } if(nbAudioTrack) for(int i=0;i<nbAudioTrack;i++) { uint32_t acc=a[i]->getInfo()->encoding; if(acc!=WAV_MP2 && acc!=WAV_MP3 && acc!=WAV_AAC) { GUI_Error_HIG("Unsupported","Only AAC & mpegaudio supported for audio"); return false; } uint32_t fq=a[i]->getInfo()->frequency; if(fq!=44100 &&fq!=22050 && fq!=11025) { GUI_Error_HIG("Unsupported","Only 44.1, 22.050 and 11.025 kHz supported"); return false; } } if(false==setupMuxer("flv",file)) { printf("[FLV] Failed to open muxer\n"); return false; } if(initVideo(s)==false) { printf("[FLV] Failed to init video\n"); return false; } AVCodecContext *c = video_st->codec; AVDictionary *dict = NULL; rescaleFps(s->getAvgFps1000(),&(c->time_base)); video_st->time_base=c->time_base; c->gop_size=15; if(initAudio(nbAudioTrack,a)==false) { printf("[FLV] Failed to init audio\n"); return false; } int er=avio_open(&(oc->pb), file, AVIO_FLAG_WRITE); if (er) { ADM_error("[Flv]: Failed to open file :%s, er=%d\n",file,er); r=false; goto finish; } char buf[64]; snprintf(buf, sizeof(buf), "%d", AV_TIME_BASE / 10); av_dict_set(&dict, "preload", buf, 0); av_dict_set(&dict, "max_delay", buf, 0); av_dict_set(&dict, "muxrate", "10080000", 0); if (avformat_write_header(oc, &dict) < 0) { printf("[Flv Muxer] Muxer rejected the parameters\n"); r=false; goto finish; } initialized=true; finish: vStream=s; aStreams=a; nbAStreams=nbAudioTrack; return r; }
bool muxerMP4::open(const char *file, ADM_videoStream *s,uint32_t nbAudioTrack,ADM_audioStream **a) { if(!isMpeg4Compatible(s->getFCC()) && !isH264Compatible(s->getFCC())) { GUI_Error_HIG("Unsupported","Only MP4Video & H264 supported for video"); return false; } if(nbAudioTrack) for(int i=0; i<nbAudioTrack; i++) { uint32_t acc=a[i]->getInfo()->encoding; if(acc!=WAV_MP2 && acc!=WAV_MP3 && acc!=WAV_AAC) { GUI_Error_HIG("Unsupported","Only AAC & mpegaudio supported for audio"); return false; } } /* All seems fine, open stuff */ const char *f="mp4"; if(muxerConfig.muxerType==MP4_MUXER_PSP) f="psp"; if(false==setupMuxer(f,file)) { printf("[MP4] Failed to open muxer\n"); return false; } if(initVideo(s)==false) { printf("[MP4] Failed to init video\n"); return false; } AVCodecContext *c; AVRational myTimeBase; c = video_st->codec; rescaleFps(s->getAvgFps1000(),&(c->time_base)); myTimeBase=video_st->time_base=c->time_base; ADM_info("Video stream time base :%d,%d\n",video_st->time_base.num,video_st->time_base.den); c->gop_size=15; if(initAudio(nbAudioTrack,a)==false) { printf("[MP4] Failed to init audio\n"); return false; } // /audio int er = avio_open(&(oc->pb), file, AVIO_FLAG_WRITE); ADM_info("Timebase In = %d/%d\n",myTimeBase.num,myTimeBase.den); if (er) { ADM_error("[Mp4]: Failed to open file :%s, er=%d\n",file,er); return false; } AVDictionary *dict = NULL; char buf[64]; snprintf(buf, sizeof(buf), "%d", AV_TIME_BASE / 10); av_dict_set(&dict, "preload", buf, 0); av_dict_set(&dict, "max_delay", "200000", 0); av_dict_set(&dict, "muxrate", "10080000", 0); #ifndef _WIN32 // does not work on windows as the file must be opened twice at the same time av_dict_set(&dict, "movflags","faststart",0); #endif ADM_assert(avformat_write_header(oc, &dict) >= 0); ADM_info("Timebase codec = %d/%d\n",c->time_base.num,c->time_base.den); ADM_info("Timebase stream = %d/%d\n",video_st->time_base.num,video_st->time_base.den); if(myTimeBase.den==video_st->time_base.den && video_st->time_base.num==1) { roundup=myTimeBase.num; ADM_warning("Timebase roundup = %d\n",roundup); } av_dict_free(&dict); vStream=s; aStreams=a; nbAStreams=nbAudioTrack; initialized=true; return true; }