bool muxerMp4v2::open(const char *file, ADM_videoStream *s,uint32_t nbAudioTrack,ADM_audioStream **a) { audioDelay=s->getVideoDelay(); vStream=s; nbAStreams=nbAudioTrack; aStreams=a; videoBufferSize=vStream->getWidth()*vStream->getHeight()*3; videoBuffer[0]=new uint8_t[videoBufferSize]; videoBuffer[1]=new uint8_t[videoBufferSize]; scratchBuffer=new uint8_t[videoBufferSize]; in[0].bufferSize=videoBufferSize; in[0].data=videoBuffer[0]; in[1].bufferSize=videoBufferSize; in[1].data=videoBuffer[1]; targetFileName=string(file); //------Verify everything is ok : Accept Mp4 & H264 for video, AAC for audio ---- uint32_t fcc=vStream->getFCC(); if(!isH264Compatible(fcc) && !isMpeg4Compatible(fcc)) { ADM_error("[mp4v2] Only h264 and mp4 video track!\n"); return false; } for(int i=0;i<nbAStreams;i++) { int encoding=aStreams[i]->getInfo()->encoding; switch(encoding) { case WAV_MP2:case WAV_MP3:case WAV_AAC:case WAV_AC3: continue; default: GUI_Error_HIG("Audio","Audio format not supported, only AAC/MP3/AC3"); return false; } } //------Verify everything is ok : Accept Mp4 & H264 for video, AAC for audio ---- // Create file handle=MP4Create( file, ADM_MP4_OPTIONS_OPEN); if(MP4_INVALID_FILE_HANDLE==handle) { ADM_error("[mp4v2]Cannot create output file %s\n",file); return false; } MP4LogSetLevel(MP4_LOG_INFO); if (!(MP4SetTimeScale( handle, 90*1000 ))) // 90 kHz tick { ADM_error("[mp4v2]Cannot set timescale to us\n"); return false; } if(false==initVideo()) { ADM_error("Cannot init video\n"); return false; } if(false==initAudio()) { ADM_error("Cannot init audio\n"); return false; } return true; er: return false; }
static void DisableMP4v2Logging() { MP4LogSetLevel(MP4_LOG_NONE); }