在isobmff库中,如何只写moof和mdat(m4v)(MUXING)

问题描述 投票:0回答:1

我正在使用 isobmff 库 https://github.com/MPEGGroup/isobmff.
我的目标是制作 m4v 文件。
我知道如何使用这个库制作 mp4 和 fmp4。
但是,我不知道如何只制作 m4v(仅限 moof 和 mdat 框)文件。
库没有单独提供这个功能。
所以我要尝试定制它。
简单用法如下。

ISOMovie moov;       // movie box 
ISOMedia media;
ISOTrack trak;
err = MP4NewMovie(&moov, 0, 0, 0, 0, 0, 0);
err = MP4SetMovieTimeScale (moov, TIMESCALE);
err = ISONewMovieTrack(moov, MP4NewTrackIsVisual, &trak);
err = ISOSetTrackFragmentDefaults(trak, 0, 0, 0, 0);
err = ISONewTrackMedia(trak, &media, ISOVisualHandlerType, TIMESCALE, NULL);
err = ISOBeginMediaEdits(media);

// first, add the sps pps. if audio add audio specific config.
err = ISOAddMediaSamples(media,0,0,durationsH,sizesH,sampleEntryH,0,0);
err = ISOEndMediaEdits(media);

// write fragment 
err = ISOStartMovieFragment(moov);
err = ISOSetSamplestoGroupType(media, SAMPLE_GROUP_NORMAL);
err = ISOAddMediaSamples(media,sampleH,1,durationsH,sizesH,sampleEntryH,0,0);
err = ISOWriteMovieToFile(moov,"fmp4.mp4");

ISOWriteMovieToFile 函数写入整个电影盒文件。 但我只需要写moof和mdat框(m4v文件格式)。

就我而言,我有 h264 文件并混合为 isobmff 格式。 我在下面尝试过

MP4PrivateMovieRecordPtr movie;
movie = (MP4PrivateMovieRecordPtr)moov;
// when i access movie->movieFragments , this return NULL.
printf("movieFragments %p \n",movie->movieFragments);

MP4PrivateMovieRecordPtr 如下。

typedef struct MP4PrivateMovieRecord
{
  u32 referenceCount;
  struct FileMappingObjectRecord *fileMappingObject;
  struct MP4InputStreamRecord *inputStream;
  MP4AtomPtr moovAtomPtr; /* might be a moof or a moov */
  MP4AtomPtr true_moov;

  MP4AtomPtr mdat;        /* first, primary, mdat */
  MP4LinkedList mdatList; /* all the others we find */
  /*MP4Track initialBIFS;*/
  /*MP4Track initialOD; */
  u32 fileType;    /* the file type: MPEG-4, Motion JPEG-2000, or QuickTime */
  MP4AtomPtr ftyp; /* the file type atom */
  MP4AtomPtr jp2h; /* for JPEG-2000, the JP2 header atom */
  MP4AtomPtr sgnt; /* for JPEG-2000, the signature atom */
  MP4AtomPtr meta; /* file-level meta-data */
  MP4AtomPtr meco; /* Deprecated file-level additional meta-data container */

  void *inMemoryDataHandler;
  MP4Handle prepend_handle;
  MP4LinkedList movieFragments;
} MP4PrivateMovieRecord, *MP4PrivateMovieRecordPtr;

你能给我任何解决方案或建议吗..?

感谢您的阅读。

我期待您的回复。

video mp4 iso fmp4 m4v
1个回答
0
投票

我找到了解决方案。谢谢你

© www.soinside.com 2019 - 2024. All rights reserved.