
Recherche avancée
Médias (1)
-
La conservation du net art au musée. Les stratégies à l’œuvre
26 mai 2011
Mis à jour : Juillet 2013
Langue : français
Type : Texte
Autres articles (32)
-
Organiser par catégorie
17 mai 2013, parDans MédiaSPIP, une rubrique a 2 noms : catégorie et rubrique.
Les différents documents stockés dans MédiaSPIP peuvent être rangés dans différentes catégories. On peut créer une catégorie en cliquant sur "publier une catégorie" dans le menu publier en haut à droite ( après authentification ). Une catégorie peut être rangée dans une autre catégorie aussi ce qui fait qu’on peut construire une arborescence de catégories.
Lors de la publication prochaine d’un document, la nouvelle catégorie créée sera proposée (...) -
L’agrémenter visuellement
10 avril 2011MediaSPIP est basé sur un système de thèmes et de squelettes. Les squelettes définissent le placement des informations dans la page, définissant un usage spécifique de la plateforme, et les thèmes l’habillage graphique général.
Chacun peut proposer un nouveau thème graphique ou un squelette et le mettre à disposition de la communauté. -
(Dés)Activation de fonctionnalités (plugins)
18 février 2011, parPour gérer l’ajout et la suppression de fonctionnalités supplémentaires (ou plugins), MediaSPIP utilise à partir de la version 0.2 SVP.
SVP permet l’activation facile de plugins depuis l’espace de configuration de MediaSPIP.
Pour y accéder, il suffit de se rendre dans l’espace de configuration puis de se rendre sur la page "Gestion des plugins".
MediaSPIP est fourni par défaut avec l’ensemble des plugins dits "compatibles", ils ont été testés et intégrés afin de fonctionner parfaitement avec chaque (...)
Sur d’autres sites (4779)
-
Error when use command of ffmpeg on android
19 février 2014, par user2830969I get source code from https://github.com/JayH5/android-ffmpeg-cmdline and then I edit code to be simple than.
public ProcessRunnable create() {
if (inputPath == null || outputPath == null) {
throw new IllegalStateException("Need an input and output filepath!");
}
final List<string> cmd = new LinkedList<string>();
cmd.add(mFfmpegPath);
cmd.add("-i");
cmd.add(inputPath);
cmd.add("-s 240x160");
cmd.add(outputPath);
Log.w("Command", cmd.toString());
final ProcessBuilder pb = new ProcessBuilder(cmd);
return new ProcessRunnable(pb);
}
</string></string>When I run code, the result is *.mp file 0.00 kb.
Please help me fix about this.
thank so much -
FFmpeg.Autogen Wrapper : Issue with Zero-Sized Atom Boxes in MP4 Output
11 juin 2024, par Alexander JanssonI just started learning ffmpeg using ffmpeg.autogen wrapper version 5.1 in c#, and ffmpeg shared libs version 5.1. Im trying to facilitate a class which screenrecords using gdigrab and produces streamable mp4 to a/an buffer/event. Everything seems to work as suposed to with no error except that the outputstream produces atom boxes with 0 in size thus small file size aswell, no data seems to be produced in the boxes, the "debug test mp4 file" is analyzed with MP4Box and the box info is provided in the thread.


To be more specific why does this code produce empty atomboxes, is someone able to make the data produced actually contain any frame data from the gdigrab editing my code ?


`code :


public unsafe class ScreenStreamer : IDisposable
 {
 private readonly AVCodec* productionCodec;
 private readonly AVCodec* screenCaptureAVCodec;
 private readonly AVCodecContext* productionAVCodecContext;
 private readonly AVFormatContext* productionFormatContext;
 private readonly AVCodecContext* screenCaptureAVCodecContext;
 private readonly AVDictionary* productionAVCodecOptions;
 private readonly AVInputFormat* screenCaptureInputFormat;
 private readonly AVFormatContext* screenCaptureInputFormatContext;
 private readonly int gDIGrabVideoStreamIndex;
 private readonly System.Drawing.Size screenBounds;
 private readonly int _produceAtleastAmount;
 public EventHandler OnNewVideoDataProduced;
 private MemoryStream unsafeToManagedBridgeBuffer;
 private CancellationTokenSource cancellationTokenSource;
 private Task recorderTask;

 public ScreenStreamer(int fps, int bitrate, int screenIndex, int produceAtleastAmount = 1000)
 {
 ffmpeg.avdevice_register_all();
 ffmpeg.avformat_network_init();
 recorderTask = Task.CompletedTask;
 cancellationTokenSource = new CancellationTokenSource();
 unsafeToManagedBridgeBuffer = new MemoryStream();
 _produceAtleastAmount = produceAtleastAmount;

 // Allocate and initialize production codec and context
 productionCodec = ffmpeg.avcodec_find_encoder(AVCodecID.AV_CODEC_ID_H264);
 if (productionCodec == null) throw new ApplicationException("Could not find encoder for codec ID H264.");

 productionAVCodecContext = ffmpeg.avcodec_alloc_context3(productionCodec);
 if (productionAVCodecContext == null) throw new ApplicationException("Could not allocate video codec context.");

 // Set codec parameters
 screenBounds = RetrieveScreenBounds(screenIndex);
 productionAVCodecContext->width = screenBounds.Width;
 productionAVCodecContext->height = screenBounds.Height;
 productionAVCodecContext->time_base = new AVRational() { den = fps, num = 1 };
 productionAVCodecContext->pix_fmt = AVPixelFormat.AV_PIX_FMT_YUV420P;
 productionAVCodecContext->bit_rate = bitrate;

 int result = ffmpeg.av_opt_set(productionAVCodecContext->priv_data, "preset", "veryfast", 0);
 if (result != 0)
 {
 throw new ApplicationException($"Failed to set options with error code {result}.");
 }

 // Open codec
 fixed (AVDictionary** pm = &productionAVCodecOptions)
 {
 result = ffmpeg.av_dict_set(pm, "movflags", "frag_keyframe+empty_moov+default_base_moof", 0);
 if (result < 0)
 {
 throw new ApplicationException($"Failed to set dictionary with error code {result}.");
 }

 result = ffmpeg.avcodec_open2(productionAVCodecContext, productionCodec, pm);
 if (result < 0)
 {
 throw new ApplicationException($"Failed to open codec with error code {result}.");
 }
 }

 // Allocate and initialize screen capture codec and context
 screenCaptureInputFormat = ffmpeg.av_find_input_format("gdigrab");
 if (screenCaptureInputFormat == null) throw new ApplicationException("Could not find input format gdigrab.");

 fixed (AVFormatContext** ps = &screenCaptureInputFormatContext)
 {
 result = ffmpeg.avformat_open_input(ps, "desktop", screenCaptureInputFormat, null);
 if (result < 0)
 {
 throw new ApplicationException($"Failed to open input with error code {result}.");
 }

 result = ffmpeg.avformat_find_stream_info(screenCaptureInputFormatContext, null);
 if (result < 0)
 {
 throw new ApplicationException($"Failed to find stream info with error code {result}.");
 }
 }

 gDIGrabVideoStreamIndex = -1;
 for (int i = 0; i < screenCaptureInputFormatContext->nb_streams; i++)
 {
 if (screenCaptureInputFormatContext->streams[i]->codecpar->codec_type == AVMediaType.AVMEDIA_TYPE_VIDEO)
 {
 gDIGrabVideoStreamIndex = i;
 break;
 }
 }

 if (gDIGrabVideoStreamIndex < 0)
 {
 throw new ApplicationException("Failed to find video stream in input.");
 }

 AVCodecParameters* codecParameters = screenCaptureInputFormatContext->streams[gDIGrabVideoStreamIndex]->codecpar;
 screenCaptureAVCodec = ffmpeg.avcodec_find_decoder(codecParameters->codec_id);
 if (screenCaptureAVCodec == null)
 {
 throw new ApplicationException("Could not find decoder for screen capture.");
 }

 screenCaptureAVCodecContext = ffmpeg.avcodec_alloc_context3(screenCaptureAVCodec);
 if (screenCaptureAVCodecContext == null)
 {
 throw new ApplicationException("Could not allocate screen capture codec context.");
 }

 result = ffmpeg.avcodec_parameters_to_context(screenCaptureAVCodecContext, codecParameters);
 if (result < 0)
 {
 throw new ApplicationException($"Failed to copy codec parameters to context with error code {result}.");
 }

 result = ffmpeg.avcodec_open2(screenCaptureAVCodecContext, screenCaptureAVCodec, null);
 if (result < 0)
 {
 throw new ApplicationException($"Failed to open screen capture codec with error code {result}.");
 }
 }

 public void Start()
 {
 recorderTask = Task.Run(() =>
 {
 AVPacket* packet = ffmpeg.av_packet_alloc();
 AVFrame* rawFrame = ffmpeg.av_frame_alloc();
 AVFrame* compatibleFrame = null;
 byte* dstBuffer = null;

 try
 {
 while (!cancellationTokenSource.Token.IsCancellationRequested)
 {
 if (ffmpeg.av_read_frame(screenCaptureInputFormatContext, packet) >= 0)
 {
 if (packet->stream_index == gDIGrabVideoStreamIndex)
 {
 int response = ffmpeg.avcodec_send_packet(screenCaptureAVCodecContext, packet);
 if (response < 0)
 {
 throw new ApplicationException($"Error while sending a packet to the decoder: {response}");
 }

 response = ffmpeg.avcodec_receive_frame(screenCaptureAVCodecContext, rawFrame);
 if (response == ffmpeg.AVERROR(ffmpeg.EAGAIN) || response == ffmpeg.AVERROR_EOF)
 {
 continue;
 }
 else if (response < 0)
 {
 throw new ApplicationException($"Error while receiving a frame from the decoder: {response}");
 }

 compatibleFrame = ConvertToCompatiblePixelFormat(rawFrame, out dstBuffer);

 response = ffmpeg.avcodec_send_frame(productionAVCodecContext, compatibleFrame);
 if (response < 0)
 {
 throw new ApplicationException($"Error while sending a frame to the encoder: {response}");
 }

 while (response >= 0)
 {
 response = ffmpeg.avcodec_receive_packet(productionAVCodecContext, packet);
 if (response == ffmpeg.AVERROR(ffmpeg.EAGAIN) || response == ffmpeg.AVERROR_EOF)
 {
 break;
 }
 else if (response < 0)
 {
 throw new ApplicationException($"Error while receiving a packet from the encoder: {response}");
 }

 using var packetStream = new UnmanagedMemoryStream(packet->data, packet->size);
 packetStream.CopyTo(unsafeToManagedBridgeBuffer);
 byte[] managedBytes = unsafeToManagedBridgeBuffer.ToArray();
 OnNewVideoDataProduced?.Invoke(this, managedBytes);
 unsafeToManagedBridgeBuffer.SetLength(0);
 }
 }
 }
 ffmpeg.av_packet_unref(packet);
 ffmpeg.av_frame_unref(rawFrame);
 if (compatibleFrame != null)
 {
 ffmpeg.av_frame_unref(compatibleFrame);
 ffmpeg.av_free(dstBuffer);
 }
 }
 }
 finally
 {
 ffmpeg.av_packet_free(&packet);
 ffmpeg.av_frame_free(&rawFrame);
 if (compatibleFrame != null)
 {
 ffmpeg.av_frame_free(&compatibleFrame);
 }
 }
 });
 }

 public AVFrame* ConvertToCompatiblePixelFormat(AVFrame* srcFrame, out byte* dstBuffer)
 {
 AVFrame* dstFrame = ffmpeg.av_frame_alloc();
 int buffer_size = ffmpeg.av_image_get_buffer_size(productionAVCodecContext->pix_fmt, productionAVCodecContext->width, productionAVCodecContext->height, 1);
 byte_ptrArray4 dstData = new byte_ptrArray4();
 int_array4 dstLinesize = new int_array4();
 dstBuffer = (byte*)ffmpeg.av_malloc((ulong)buffer_size);
 ffmpeg.av_image_fill_arrays(ref dstData, ref dstLinesize, dstBuffer, productionAVCodecContext->pix_fmt, productionAVCodecContext->width, productionAVCodecContext->height, 1);

 dstFrame->format = (int)productionAVCodecContext->pix_fmt;
 dstFrame->width = productionAVCodecContext->width;
 dstFrame->height = productionAVCodecContext->height;
 dstFrame->data.UpdateFrom(dstData);
 dstFrame->linesize.UpdateFrom(dstLinesize);

 SwsContext* swsCtx = ffmpeg.sws_getContext(
 srcFrame->width, srcFrame->height, (AVPixelFormat)srcFrame->format,
 productionAVCodecContext->width, productionAVCodecContext->height, productionAVCodecContext->pix_fmt,
 ffmpeg.SWS_BILINEAR, null, null, null);

 if (swsCtx == null)
 {
 throw new ApplicationException("Could not initialize the conversion context.");
 }

 ffmpeg.sws_scale(swsCtx, srcFrame->data, srcFrame->linesize, 0, srcFrame->height, dstFrame->data, dstFrame->linesize);
 ffmpeg.sws_freeContext(swsCtx);
 return dstFrame;
 }

 private System.Drawing.Size RetrieveScreenBounds(int screenIndex)
 {
 return new System.Drawing.Size(1920, 1080);
 }

 public void Dispose()
 {
 cancellationTokenSource?.Cancel();
 recorderTask?.Wait();
 cancellationTokenSource?.Dispose();
 recorderTask?.Dispose();
 unsafeToManagedBridgeBuffer?.Dispose();

 fixed (AVCodecContext** p = &productionAVCodecContext)
 {
 if (*p != null)
 {
 ffmpeg.avcodec_free_context(p);
 }
 }
 fixed (AVCodecContext** p = &screenCaptureAVCodecContext)
 {
 if (*p != null)
 {
 ffmpeg.avcodec_free_context(p);
 }
 }

 if (productionFormatContext != null)
 {
 ffmpeg.avformat_free_context(productionFormatContext);
 }

 if (screenCaptureInputFormatContext != null)
 {
 ffmpeg.avformat_free_context(screenCaptureInputFormatContext);
 }

 if (productionAVCodecOptions != null)
 {
 fixed (AVDictionary** p = &productionAVCodecOptions)
 {
 ffmpeg.av_dict_free(p);
 }
 }
 }
 }



I call Start method and wait 8 econds, out of scope I write the bytes to an mp4 file without using the write trailer just to debug the atomboxes. and the mp4 debugging box output I got :


(Full OUTPUT)
https://pastebin.com/xkM4MfG7



(Not full)




"
<boxes>
<uuidbox size="0" type="uuid" uuid="{00000000-00000000-00000000-00000000}" specification="unknown" container="unknown">
</uuidbox>
<trackreferencetypebox size="0" type="cdsc" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="hint" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="font" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="hind" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="vdep" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="vplx" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="subt" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="thmb" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="mpod" specification="p14" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="dpnd" specification="p14" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="sync" specification="p14" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="ipir" specification="p14" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="sbas" specification="p15" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="scal" specification="p15" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="tbas" specification="p15" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="sabt" specification="p15" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="oref" specification="p15" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="adda" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="adrc" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="iloc" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="avcp" specification="p15" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="swto" specification="p15" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="swfr" specification="p15" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="chap" specification="apple" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="tmcd" specification="apple" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="cdep" specification="apple" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="scpt" specification="apple" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="ssrc" specification="apple" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="lyra" specification="apple" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<itemreferencebox size="0" type="tbas" specification="p12" container="iref">
<itemreferenceboxentry itemid=""></itemreferenceboxentry>
</itemreferencebox>
<itemreferencebox size="0" type="iloc" specification="p12" container="iref">
<itemreferenceboxentry itemid=""></itemreferenceboxentry>
</itemreferencebox>
<itemreferencebox size="0" type="fdel" specification="p12" container="iref">
<itemreferenceboxentry itemid=""></itemreferenceboxentry>
</itemreferencebox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p12" container="stbl traf">
<rollrecoveryentry></rollrecoveryentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p12" container="stbl traf">
<audioprerollentry></audioprerollentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p12" container="stbl traf">
<visualrandomaccessentry></visualrandomaccessentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<cencsampleencryptiongroupentry isencrypted="" kid=""></cencsampleencryptiongroupentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<operatingpointsinformation>
 <profiletierlevel></profiletierlevel>
<operatingpoint minpicwidth="" minpicheight="" maxpicwidth="" maxpicheight="" maxchromaformat="" maxbitdepth="" avgframerate="" constantframerate="" maxbitrate="" avgbitrate=""></operatingpoint>

</operatingpointsinformation>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<layerinformation>
<layerinfoitem></layerinfoitem>
</layerinformation>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<tileregiongroupentry tilegroup="" independent="" x="" y="" w="" h="">
<tileregiondependency tileid=""></tileregiondependency>
</tileregiongroupentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<nalumap rle="">
<nalumapentry groupid=""></nalumapentry>
</nalumap>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p12" container="stbl traf">
<temporallevelentry></temporallevelentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p12" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p12" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p12" container="stbl traf">
<sapentry></sapentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<syncsamplegroupentry></syncsamplegroupentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<subpictureorderentry refs=""></subpictureorderentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="3gpp" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="3gpp" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<sampledescriptionentrybox size="0" type="GNRM" specification="unknown" container="stsd" extensiondatasize="0">
</sampledescriptionentrybox>
<visualsampledescriptionbox size="0" type="GNRV" specification="unknown" container="stsd" version="0" revision="0" vendor="0" temporalquality="0" spacialquality="0" width="0" height="0" horizontalresolution="4718592" verticalresolution="4718592" compressorname="" bitdepth="24">
</visualsampledescriptionbox>
<audiosampledescriptionbox size="0" type="GNRA" specification="unknown" container="stsd" version="0" revision="0" vendor="0" channelcount="2" bitspersample="16" samplerate="0">
</audiosampledescriptionbox>
<trackgrouptypebox size="0" type="msrc" version="0" flags="0" specification="p12" container="trgr">
</trackgrouptypebox>
<trackgrouptypebox size="0" type="ster" version="0" flags="0" specification="p12" container="trgr">
</trackgrouptypebox>
<trackgrouptypebox size="0" type="cstg" version="0" flags="0" specification="p15" container="trgr">
</trackgrouptypebox>
<freespacebox size="0" type="free" specification="p12" container="*">
</freespacebox>
<freespacebox size="0" type="free" specification="p12" container="*">
</freespacebox>
<mediadatabox size="0" type="mdat" specification="p12" container="file">
</mediadatabox>
<mediadatabox size="0" type="mdat" specification="p12" container="meta">
"
</mediadatabox></boxes>


-
FFmpeg.Autogen : Issue with Zero-Sized Atom Boxes in MP4 Output
16 juin 2024, par Alexander JanssonI just started learning ffmpeg using ffmpeg.autogen wrapper version 5.1 in c#, and ffmpeg shared libs version 5.1. Im trying to facilitate a class which screenrecords using gdigrab and produces streamable mp4 to a/an buffer/event. Everything seems to work as suposed to with no error except that the outputstream produces atom boxes with 0 in size thus small file size aswell, no data seems to be produced in the boxes, the "debug test mp4 file" is analyzed with MP4Box and the box info is provided in the thread.


To be more specific why does this code produce empty atomboxes, is someone able to make the data produced actually contain any frame data from the gdigrab editing my code ?


`code :


public unsafe class ScreenStreamer : IDisposable
 {
 private readonly AVCodec* productionCodec;
 private readonly AVCodec* screenCaptureAVCodec;
 private readonly AVCodecContext* productionAVCodecContext;
 private readonly AVFormatContext* productionFormatContext;
 private readonly AVCodecContext* screenCaptureAVCodecContext;
 private readonly AVDictionary* productionAVCodecOptions;
 private readonly AVInputFormat* screenCaptureInputFormat;
 private readonly AVFormatContext* screenCaptureInputFormatContext;
 private readonly int gDIGrabVideoStreamIndex;
 private readonly System.Drawing.Size screenBounds;
 private readonly int _produceAtleastAmount;
 public EventHandler OnNewVideoDataProduced;
 private MemoryStream unsafeToManagedBridgeBuffer;
 private CancellationTokenSource cancellationTokenSource;
 private Task recorderTask;

 public ScreenStreamer(int fps, int bitrate, int screenIndex, int produceAtleastAmount = 1000)
 {
 ffmpeg.avdevice_register_all();
 ffmpeg.avformat_network_init();
 recorderTask = Task.CompletedTask;
 cancellationTokenSource = new CancellationTokenSource();
 unsafeToManagedBridgeBuffer = new MemoryStream();
 _produceAtleastAmount = produceAtleastAmount;

 // Allocate and initialize production codec and context
 productionCodec = ffmpeg.avcodec_find_encoder(AVCodecID.AV_CODEC_ID_H264);
 if (productionCodec == null) throw new ApplicationException("Could not find encoder for codec ID H264.");

 productionAVCodecContext = ffmpeg.avcodec_alloc_context3(productionCodec);
 if (productionAVCodecContext == null) throw new ApplicationException("Could not allocate video codec context.");

 // Set codec parameters
 screenBounds = RetrieveScreenBounds(screenIndex);
 productionAVCodecContext->width = screenBounds.Width;
 productionAVCodecContext->height = screenBounds.Height;
 productionAVCodecContext->time_base = new AVRational() { den = fps, num = 1 };
 productionAVCodecContext->pix_fmt = AVPixelFormat.AV_PIX_FMT_YUV420P;
 productionAVCodecContext->bit_rate = bitrate;

 int result = ffmpeg.av_opt_set(productionAVCodecContext->priv_data, "preset", "veryfast", 0);
 if (result != 0)
 {
 throw new ApplicationException($"Failed to set options with error code {result}.");
 }

 // Open codec
 fixed (AVDictionary** pm = &productionAVCodecOptions)
 {
 result = ffmpeg.av_dict_set(pm, "movflags", "frag_keyframe+empty_moov+default_base_moof", 0);
 if (result < 0)
 {
 throw new ApplicationException($"Failed to set dictionary with error code {result}.");
 }

 result = ffmpeg.avcodec_open2(productionAVCodecContext, productionCodec, pm);
 if (result < 0)
 {
 throw new ApplicationException($"Failed to open codec with error code {result}.");
 }
 }

 // Allocate and initialize screen capture codec and context
 screenCaptureInputFormat = ffmpeg.av_find_input_format("gdigrab");
 if (screenCaptureInputFormat == null) throw new ApplicationException("Could not find input format gdigrab.");

 fixed (AVFormatContext** ps = &screenCaptureInputFormatContext)
 {
 result = ffmpeg.avformat_open_input(ps, "desktop", screenCaptureInputFormat, null);
 if (result < 0)
 {
 throw new ApplicationException($"Failed to open input with error code {result}.");
 }

 result = ffmpeg.avformat_find_stream_info(screenCaptureInputFormatContext, null);
 if (result < 0)
 {
 throw new ApplicationException($"Failed to find stream info with error code {result}.");
 }
 }

 gDIGrabVideoStreamIndex = -1;
 for (int i = 0; i < screenCaptureInputFormatContext->nb_streams; i++)
 {
 if (screenCaptureInputFormatContext->streams[i]->codecpar->codec_type == AVMediaType.AVMEDIA_TYPE_VIDEO)
 {
 gDIGrabVideoStreamIndex = i;
 break;
 }
 }

 if (gDIGrabVideoStreamIndex < 0)
 {
 throw new ApplicationException("Failed to find video stream in input.");
 }

 AVCodecParameters* codecParameters = screenCaptureInputFormatContext->streams[gDIGrabVideoStreamIndex]->codecpar;
 screenCaptureAVCodec = ffmpeg.avcodec_find_decoder(codecParameters->codec_id);
 if (screenCaptureAVCodec == null)
 {
 throw new ApplicationException("Could not find decoder for screen capture.");
 }

 screenCaptureAVCodecContext = ffmpeg.avcodec_alloc_context3(screenCaptureAVCodec);
 if (screenCaptureAVCodecContext == null)
 {
 throw new ApplicationException("Could not allocate screen capture codec context.");
 }

 result = ffmpeg.avcodec_parameters_to_context(screenCaptureAVCodecContext, codecParameters);
 if (result < 0)
 {
 throw new ApplicationException($"Failed to copy codec parameters to context with error code {result}.");
 }

 result = ffmpeg.avcodec_open2(screenCaptureAVCodecContext, screenCaptureAVCodec, null);
 if (result < 0)
 {
 throw new ApplicationException($"Failed to open screen capture codec with error code {result}.");
 }
 }

 public void Start()
 {
 recorderTask = Task.Run(() =>
 {
 AVPacket* packet = ffmpeg.av_packet_alloc();
 AVFrame* rawFrame = ffmpeg.av_frame_alloc();
 AVFrame* compatibleFrame = null;
 byte* dstBuffer = null;

 try
 {
 while (!cancellationTokenSource.Token.IsCancellationRequested)
 {
 if (ffmpeg.av_read_frame(screenCaptureInputFormatContext, packet) >= 0)
 {
 if (packet->stream_index == gDIGrabVideoStreamIndex)
 {
 int response = ffmpeg.avcodec_send_packet(screenCaptureAVCodecContext, packet);
 if (response < 0)
 {
 throw new ApplicationException($"Error while sending a packet to the decoder: {response}");
 }

 response = ffmpeg.avcodec_receive_frame(screenCaptureAVCodecContext, rawFrame);
 if (response == ffmpeg.AVERROR(ffmpeg.EAGAIN) || response == ffmpeg.AVERROR_EOF)
 {
 continue;
 }
 else if (response < 0)
 {
 throw new ApplicationException($"Error while receiving a frame from the decoder: {response}");
 }

 compatibleFrame = ConvertToCompatiblePixelFormat(rawFrame, out dstBuffer);

 response = ffmpeg.avcodec_send_frame(productionAVCodecContext, compatibleFrame);
 if (response < 0)
 {
 throw new ApplicationException($"Error while sending a frame to the encoder: {response}");
 }

 while (response >= 0)
 {
 response = ffmpeg.avcodec_receive_packet(productionAVCodecContext, packet);
 if (response == ffmpeg.AVERROR(ffmpeg.EAGAIN) || response == ffmpeg.AVERROR_EOF)
 {
 break;
 }
 else if (response < 0)
 {
 throw new ApplicationException($"Error while receiving a packet from the encoder: {response}");
 }

 using var packetStream = new UnmanagedMemoryStream(packet->data, packet->size);
 packetStream.CopyTo(unsafeToManagedBridgeBuffer);
 byte[] managedBytes = unsafeToManagedBridgeBuffer.ToArray();
 OnNewVideoDataProduced?.Invoke(this, managedBytes);
 unsafeToManagedBridgeBuffer.SetLength(0);
 }
 }
 }
 ffmpeg.av_packet_unref(packet);
 ffmpeg.av_frame_unref(rawFrame);
 if (compatibleFrame != null)
 {
 ffmpeg.av_frame_unref(compatibleFrame);
 ffmpeg.av_free(dstBuffer);
 }
 }
 }
 finally
 {
 ffmpeg.av_packet_free(&packet);
 ffmpeg.av_frame_free(&rawFrame);
 if (compatibleFrame != null)
 {
 ffmpeg.av_frame_free(&compatibleFrame);
 }
 }
 });
 }

 public AVFrame* ConvertToCompatiblePixelFormat(AVFrame* srcFrame, out byte* dstBuffer)
 {
 AVFrame* dstFrame = ffmpeg.av_frame_alloc();
 int buffer_size = ffmpeg.av_image_get_buffer_size(productionAVCodecContext->pix_fmt, productionAVCodecContext->width, productionAVCodecContext->height, 1);
 byte_ptrArray4 dstData = new byte_ptrArray4();
 int_array4 dstLinesize = new int_array4();
 dstBuffer = (byte*)ffmpeg.av_malloc((ulong)buffer_size);
 ffmpeg.av_image_fill_arrays(ref dstData, ref dstLinesize, dstBuffer, productionAVCodecContext->pix_fmt, productionAVCodecContext->width, productionAVCodecContext->height, 1);

 dstFrame->format = (int)productionAVCodecContext->pix_fmt;
 dstFrame->width = productionAVCodecContext->width;
 dstFrame->height = productionAVCodecContext->height;
 dstFrame->data.UpdateFrom(dstData);
 dstFrame->linesize.UpdateFrom(dstLinesize);

 SwsContext* swsCtx = ffmpeg.sws_getContext(
 srcFrame->width, srcFrame->height, (AVPixelFormat)srcFrame->format,
 productionAVCodecContext->width, productionAVCodecContext->height, productionAVCodecContext->pix_fmt,
 ffmpeg.SWS_BILINEAR, null, null, null);

 if (swsCtx == null)
 {
 throw new ApplicationException("Could not initialize the conversion context.");
 }

 ffmpeg.sws_scale(swsCtx, srcFrame->data, srcFrame->linesize, 0, srcFrame->height, dstFrame->data, dstFrame->linesize);
 ffmpeg.sws_freeContext(swsCtx);
 return dstFrame;
 }

 private System.Drawing.Size RetrieveScreenBounds(int screenIndex)
 {
 return new System.Drawing.Size(1920, 1080);
 }

 public void Dispose()
 {
 cancellationTokenSource?.Cancel();
 recorderTask?.Wait();
 cancellationTokenSource?.Dispose();
 recorderTask?.Dispose();
 unsafeToManagedBridgeBuffer?.Dispose();

 fixed (AVCodecContext** p = &productionAVCodecContext)
 {
 if (*p != null)
 {
 ffmpeg.avcodec_free_context(p);
 }
 }
 fixed (AVCodecContext** p = &screenCaptureAVCodecContext)
 {
 if (*p != null)
 {
 ffmpeg.avcodec_free_context(p);
 }
 }

 if (productionFormatContext != null)
 {
 ffmpeg.avformat_free_context(productionFormatContext);
 }

 if (screenCaptureInputFormatContext != null)
 {
 ffmpeg.avformat_free_context(screenCaptureInputFormatContext);
 }

 if (productionAVCodecOptions != null)
 {
 fixed (AVDictionary** p = &productionAVCodecOptions)
 {
 ffmpeg.av_dict_free(p);
 }
 }
 }
 }



I call Start method and wait 8 econds, out of scope I write the bytes to an mp4 file without using the write trailer just to debug the atomboxes. and the mp4 debugging box output I got :


(Full OUTPUT)
https://pastebin.com/xkM4MfG7



(Not full)




"
<boxes>
<uuidbox size="0" type="uuid" uuid="{00000000-00000000-00000000-00000000}" specification="unknown" container="unknown">
</uuidbox>
<trackreferencetypebox size="0" type="cdsc" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="hint" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="font" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="hind" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="vdep" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="vplx" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="subt" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="thmb" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="mpod" specification="p14" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="dpnd" specification="p14" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="sync" specification="p14" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="ipir" specification="p14" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="sbas" specification="p15" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="scal" specification="p15" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="tbas" specification="p15" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="sabt" specification="p15" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="oref" specification="p15" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="adda" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="adrc" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="iloc" specification="p12" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="avcp" specification="p15" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="swto" specification="p15" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="swfr" specification="p15" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="chap" specification="apple" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="tmcd" specification="apple" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="cdep" specification="apple" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="scpt" specification="apple" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="ssrc" specification="apple" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<trackreferencetypebox size="0" type="lyra" specification="apple" container="tref">
<trackreferenceentry trackid=""></trackreferenceentry>
</trackreferencetypebox>
<itemreferencebox size="0" type="tbas" specification="p12" container="iref">
<itemreferenceboxentry itemid=""></itemreferenceboxentry>
</itemreferencebox>
<itemreferencebox size="0" type="iloc" specification="p12" container="iref">
<itemreferenceboxentry itemid=""></itemreferenceboxentry>
</itemreferencebox>
<itemreferencebox size="0" type="fdel" specification="p12" container="iref">
<itemreferenceboxentry itemid=""></itemreferenceboxentry>
</itemreferencebox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p12" container="stbl traf">
<rollrecoveryentry></rollrecoveryentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p12" container="stbl traf">
<audioprerollentry></audioprerollentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p12" container="stbl traf">
<visualrandomaccessentry></visualrandomaccessentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<cencsampleencryptiongroupentry isencrypted="" kid=""></cencsampleencryptiongroupentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<operatingpointsinformation>
 <profiletierlevel></profiletierlevel>
<operatingpoint minpicwidth="" minpicheight="" maxpicwidth="" maxpicheight="" maxchromaformat="" maxbitdepth="" avgframerate="" constantframerate="" maxbitrate="" avgbitrate=""></operatingpoint>

</operatingpointsinformation>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<layerinformation>
<layerinfoitem></layerinfoitem>
</layerinformation>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<tileregiongroupentry tilegroup="" independent="" x="" y="" w="" h="">
<tileregiondependency tileid=""></tileregiondependency>
</tileregiongroupentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<nalumap rle="">
<nalumapentry groupid=""></nalumapentry>
</nalumap>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p12" container="stbl traf">
<temporallevelentry></temporallevelentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p12" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p12" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p12" container="stbl traf">
<sapentry></sapentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<syncsamplegroupentry></syncsamplegroupentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="p15" container="stbl traf">
<subpictureorderentry refs=""></subpictureorderentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="3gpp" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<samplegroupdescriptionbox size="0" type="sgpd" version="0" flags="0" specification="3gpp" container="stbl traf">
<defaultsamplegroupdescriptionentry size=""></defaultsamplegroupdescriptionentry>
</samplegroupdescriptionbox>
<sampledescriptionentrybox size="0" type="GNRM" specification="unknown" container="stsd" extensiondatasize="0">
</sampledescriptionentrybox>
<visualsampledescriptionbox size="0" type="GNRV" specification="unknown" container="stsd" version="0" revision="0" vendor="0" temporalquality="0" spacialquality="0" width="0" height="0" horizontalresolution="4718592" verticalresolution="4718592" compressorname="" bitdepth="24">
</visualsampledescriptionbox>
<audiosampledescriptionbox size="0" type="GNRA" specification="unknown" container="stsd" version="0" revision="0" vendor="0" channelcount="2" bitspersample="16" samplerate="0">
</audiosampledescriptionbox>
<trackgrouptypebox size="0" type="msrc" version="0" flags="0" specification="p12" container="trgr">
</trackgrouptypebox>
<trackgrouptypebox size="0" type="ster" version="0" flags="0" specification="p12" container="trgr">
</trackgrouptypebox>
<trackgrouptypebox size="0" type="cstg" version="0" flags="0" specification="p15" container="trgr">
</trackgrouptypebox>
<freespacebox size="0" type="free" specification="p12" container="*">
</freespacebox>
<freespacebox size="0" type="free" specification="p12" container="*">
</freespacebox>
<mediadatabox size="0" type="mdat" specification="p12" container="file">
</mediadatabox>
<mediadatabox size="0" type="mdat" specification="p12" container="meta">
"
</mediadatabox></boxes>