docs: public long[] sampleNumbers(Track track) {
  
          if ("vide".equals(track.getHandler())) {
              if (track.getSyncSamples() != null && track.getSyncSamples().length > 0) {
                  List<long[]> times = getSyncSamplesTimestamps(movie, track);
                  return getCommonIndices(track.getSyncSamples(), getTimes(track, movie), track.getTrackMetaData().getTimescale(), times.toArray(new long[times.size()][]));
              } else {
                  throw new RuntimeException("Video Tracks need sync samples. Only tracks other than video may have no sync samples.");
              }
          } else if ("soun".equals(track.getHandler())) {
              if (referenceTrack == null) {
                  for (Track candidate : movie.getTracks()) {
                      if (candidate.getSyncSamples() != null && "vide".equals(candidate.getHandler()) && candidate.getSyncSamples().length > 0) {
                          referenceTrack = candidate;
                      }
                  }
              }
              if (referenceTrack != null) {
  
                  // Gets the reference track's fra
                  long[] refSyncSamples = sampleNumbers(referenceTrack);
  
                  int refSampleCount = referenceTrack.getSamples().size();
  
                  long[] syncSamples = new long[refSyncSamples.length];
                  long minSampleRate = 192000;
                  for (Track testTrack : movie.getTracks()) {
                      if (getFormat(track).equals(getFormat(testTrack))) {
                          AudioSampleEntry ase = null;
                          for (SampleEntry sampleEntry : testTrack.getSampleEntries()) {
                              if (ase == null) {
                                  ase = (AudioSampleEntry) sampleEntry;
                              } else if (ase.getSampleRate() != ((AudioSampleEntry) sampleEntry).getSampleRate()) {
                                  throw new RuntimeException("Multiple SampleEntries and different sample rates is not supported");
                              }
                          }
                          assert ase != null;
                          if (ase.getSampleRate() < minSampleRate) {
                              minSampleRate = ase.getSampleRate();
                              long sc = testTrack.getSamples().size();
                              double stretch = (double) sc / refSampleCount;
  
                              long samplesPerFrame = testTrack.getSampleDurations()[0]; // Assuming all audio tracks have the same number of samples per frame, which they do for all known types
  
                              for (int i = 0; i < syncSamples.length; i++) {
                                  long start = (long) Math.ceil(stretch * (refSyncSamples[i] - 1) * samplesPerFrame);
                                  syncSamples[i] = start;
                                  // The Stretch makes sure that there are as much audio and video chunks!
                              }
                              break;
                          }
                      }
                  }
                  AudioSampleEntry ase = null;
                  for (SampleEntry sampleEntry : track.getSampleEntries()) {
                      if (ase == null) {
                          ase = (AudioSampleEntry) sampleEntry;
                      } else if (ase.getSampleRate() != ((AudioSampleEntry) sampleEntry).getSampleRate()) {
                          throw new RuntimeException("Multiple SampleEntries and different sample rates is not supported");
                      }
                  }
                  assert ase != null;
  
                  long samplesPerFrame = track.getSampleDurations()[0]; // Assuming all audio tracks have the same number of samples per frame, which they do for all known types
                  double factor = (double) ase.getSampleRate() / (double) minSampleRate;
                  if (factor != Math.rint(factor)) { // Not an integer
                      throw new RuntimeException("Sample rates must be a multiple of the lowest sample rate to create a correct file!");
                  }
                  for (int i = 0; i < syncSamples.length; i++) {
                      syncSamples[i] = (long) (1 + syncSamples[i] * factor / (double) samplesPerFrame);
                  }
                  return syncSamples;
              }
              throw new RuntimeException("There was absolutely no Track with sync samples. I can't work with that!");
          } else {
              // Ok, my track has no sync samples - let's find one with sync samples.
              for (Track candidate : movie.getTracks()) {
                  if (candidate.getSyncSamples() != null && candidate.getSyncSamples().length > 0) {
                      long[] refSyncSamples = sampleNumbers(candidate);
                      int refSampleCount = candidate.getSamples().size();
  
                      long[] syncSamples = new long[refSyncSamples.length];
                      long sc = track.getSamples().size();
                      double stretch = (double) sc / refSampleCount;
  
                      for (int i = 0; i < syncSamples.length; i++) {
                          long start = (long) Math.ceil(stretch * (refSyncSamples[i] - 1)) + 1;
                          syncSamples[i] = start;
                          // The Stretch makes sure that there are as much audio and video chunks!
                      }
                      return syncSamples;
                  }
              }
              throw new RuntimeException("There was absolutely no Track with sync samples. I can't work with that!");
          }
  
  
      }