/** * Write a text string to a file. * @return true on success, false on error. */ bool FileUtil::writeTextToFile( const MAUtil::String& filePath, const MAUtil::String& outText) { MAHandle file = openFileForWriting(filePath); if (file < 0) { return false; } int result = maFileWrite(file, outText.c_str(), outText.length()); maFileClose(file); return result == 0; }
bool ArtUtility::extractSingle( JobContext& job, const CoverArtBox::Item& item, uint32_t index ) { // compute out filename string out_name = job.file; FileSystem::pathnameStripExtension( out_name ); ostringstream oss; oss << out_name << ".art[" << index << ']'; // if implicit we try to determine type by inspecting data BasicType bt = item.type; if( bt == BT_IMPLICIT ) bt = computeBasicType( item.buffer, item.size ); // add file extension appropriate for known covr-box types switch( bt ) { case BT_GIF: oss << ".gif"; break; case BT_JPEG: oss << ".jpg"; break; case BT_PNG: oss << ".png"; break; case BT_BMP: oss << ".bmp"; break; default: oss << ".dat"; break; } out_name = oss.str(); verbose1f( "extracting %s (index=%d) -> %s\n", job.file.c_str(), index, out_name.c_str() ); if( dryrunAbort() ) return SUCCESS; File out( out_name, File::MODE_CREATE ); if( openFileForWriting( out )) return FAILURE; File::Size nout; if( out.write( item.buffer, item.size, nout )) return herrf( "write failed: %s\n", out_name.c_str() ); out.close(); return SUCCESS; }
/** * Write a data object to a file. * @return true on success, false on error. */ bool FileUtil::writeDataToFile( const MAUtil::String& filePath, MAHandle outData) { MAHandle file = openFileForWriting(filePath); if (file < 0) { return false; } int result = maFileWriteFromData( file, outData, 0, maGetDataSize(outData)); maFileClose(file); return result == 0; }
/* * Prepares an AVFormatContext for output. * Currently, the output format and codecs are hardcoded in this file. */ void Java_com_example_ffmpegtest_recorder_FFmpegWrapper_prepareAVFormatContext(JNIEnv *env, jobject obj, jstring jOutputPath){ init(); // Create AVRational that expects timestamps in microseconds videoSourceTimeBase = av_malloc(sizeof(AVRational)); videoSourceTimeBase->num = 1; videoSourceTimeBase->den = 1000000; audioSourceTimeBase = av_malloc(sizeof(AVRational)); audioSourceTimeBase->num = 1; audioSourceTimeBase->den = 1000000; AVFormatContext *inputFormatContext; outputPath = (*env)->GetStringUTFChars(env, jOutputPath, NULL); outputFormatContext = avFormatContextForOutputPath(outputPath, outputFormatName); LOGI("post avFormatContextForOutputPath"); // For copying AVFormatContext from sample file: /* inputFormatContext = avFormatContextForInputPath(sampleFilePath, outputFormatName); LOGI("post avFormatContextForInputPath"); copyAVFormatContext(&outputFormatContext, &inputFormatContext); LOGI("post copyAVFormatContext"); */ // For manually crafting AVFormatContext addVideoStream(outputFormatContext); addAudioStream(outputFormatContext); av_opt_set_int(outputFormatContext->priv_data, "hls_time", hlsSegmentDurationSec, 0); int result = openFileForWriting(outputFormatContext, outputPath); if(result < 0){ LOGE("openFileForWriting error: %d", result); } writeFileHeader(outputFormatContext); }
/** Action for exporting chapters from the <b>job.file</b> * * * @param job the job to process * @return mp4v2::util::SUCCESS if successful, mp4v2::util::FAILURE otherwise */ bool ChapterUtility::actionExport( JobContext& job ) { job.fileHandle = MP4Read( job.file.c_str() ); if( job.fileHandle == MP4_INVALID_FILE_HANDLE ) { return herrf( "unable to open for read: %s\n", job.file.c_str() ); } // get the list of chapters MP4Chapter_t* chapters = 0; uint32_t chapterCount = 0; MP4ChapterType chtp = MP4GetChapters( job.fileHandle, &chapters, &chapterCount, _ChapterType ); if (0 == chapterCount) { return herrf( "File \"%s\" does not contain chapters of type %s\n", job.file.c_str(), getChapterTypeName( chtp ).c_str() ); } // build the filename string outName = job.file; if( _ChapterFile.empty() ) { FileSystem::pathnameStripExtension( outName ); outName.append( ".chapters.txt" ); } else { outName = _ChapterFile; } ostringstream oss; oss << "Exporting " << chapterCount << " " << getChapterTypeName( chtp ); oss << " chapters from file " << '"' << job.file << '"' << " into chapter file " << '"' << outName << '"' << endl; verbose1f( "%s", oss.str().c_str() ); if( dryrunAbort() ) { // free up the memory MP4Free(chapters); return SUCCESS; } // open the file File out( outName, File::MODE_CREATE ); if( openFileForWriting( out ) ) { // free up the memory MP4Free(chapters); return FAILURE; } // write the chapters #if defined( _WIN32 ) static const char* LINEND = "\r\n"; #else static const char* LINEND = "\n"; #endif File::Size nout; bool failure = SUCCESS; int width = 2; if( CHPT_FMT_COMMON == _ChapterFormat && (chapterCount / 100) >= 1 ) { width = 3; } Timecode duration( 0, CHAPTERTIMESCALE ); duration.setFormat( Timecode::DECIMAL ); for( uint32_t i = 0; i < chapterCount; ++i ) { // print the infos ostringstream oss; switch( _ChapterFormat ) { case CHPT_FMT_COMMON: oss << "CHAPTER" << setw( width ) << setfill( '0' ) << i+1 << '=' << duration.svalue << LINEND << "CHAPTER" << setw( width ) << setfill( '0' ) << i+1 << "NAME=" << chapters[i].title << LINEND; break; case CHPT_FMT_NATIVE: default: oss << duration.svalue << ' ' << chapters[i].title << LINEND; } string str = oss.str(); if( out.write( str.c_str(), str.size(), nout ) ) { failure = herrf( "write to %s failed: %s\n", outName.c_str(), sys::getLastErrorStr() ); break; } // add the duration of this chapter to the sum (the start time of the next chapter) duration += Timecode(chapters[i].duration, CHAPTERTIMESCALE); } out.close(); if( failure ) { verbose1f( "removing file %s\n", outName.c_str() ); ::remove( outName.c_str() ); } // free up the memory MP4Free(chapters); return SUCCESS; }