Фрагментированный MP4 воспроизводится не в ffplay / QuickTime / Safari, а в VLC - PullRequest
0 голосов
/ 05 августа 2020

Я закодировал fMP4-Video (HEV C) в Swift с помощью VideoToolbox и CoreMedia. Полученный фрагментированный MP4 воспроизводится только в VL C.

Библиотека, которую я использую для записи fMP4, представляет собой версию этого проекта GitHub, адаптированную для HEV C: https://github.com/krad/morsel

Процесс кодирования и записи:

  1. VideoToolbox: Кодирование SampleBuffer с камеры (VTCompressionSession, как описано в WWD C 2014 Сессия 513)
  2. Использование CoreMedia -функций (например, CMVideoFormatDescriptionGetHEVCParameterSetAtIndex, CMVideoFormatDescriptionGetDimensions) для получения метаданных закодированных потоков. Я пишу содержимое CMFormatDescriptionGetExtension(description, extensionKey: "SampleDescriptionExtensionAtoms" as CFString)["hvcC"] прямо в поле hv cC. Это поле, очевидно, написано правильно, когда я изменяю один бит поля mp4, QuickTime выдает ошибку.
  3. Я добавляю данные буфера образца в библиотеку morsel, которая управляет фрагментацией и создает moof и mdat atom.

Полученный файл можно воспроизводить в VL C, когда я просто позволяю воспроизведению "работать", ничего не делая. Когда я прокручиваю время в VL C, VL C вылетает и воспроизведение останавливается.

Это также своего рода "играбельное" в Safari и QuickTime (сообщение об ошибке не отображается, открывается окно воспроизведения и отображается правильная длина файла, я могу даже изменить время воспроизведения / воспроизведение / паузу, но видео не отображается. Окно остается пустым. И это моя проблема. Мне нужно запустить fMP4 в Safari и QuickTime.

Файл вообще не воспроизводится в ffplay (такая же проблема при преобразовании с помощью ffmpeg). Строка, в которой отображается время воспроизведения, остается nan M-V: nan fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0 , сообщений об ошибках нет. Воспроизведение просто выполняется не запускается. При воспроизведении файла с помощью ffplay это результат:

ffplay version 4.3 Copyright (c) 2003-2020 the FFmpeg developers
  built with Apple clang version 11.0.3 (clang-1103.0.32.62)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3_2 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp41mp42isomhlsf
    creation_time   : 2020-08-03T20:41:08.000000Z
  Duration: N/A, bitrate: N/A
    Stream #0:0(und): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv), 1920x1080, SAR 1:1 DAR 16:9, 1000000000.00 tbr, 1000000000.00 tbn, 1000000000.00 tbc (default)
    Metadata:
      creation_time   : 2020-08-03T20:41:08.000000Z
      handler_name    : video
    nan M-V:    nan fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0 

Мой файл имеет следующую структуру:

ftyp
moov
    mvhd
    trak
        tkhd
        mdia
            mdhd
            hdlr
            minf
                vmhd
                dinf
                    dref
                stbl
                    stsd
                    stts
                    stsc
                    stsz
                    stco
    mvex
        trex
moof-(1)
mdat
moof-(2)
mdat 
...

Файл результата, который я хочу создать, должен быть похож на fMP4, обслуживаемый в этом списке воспроизведения HLS: (Пример: https://developer.apple.com/streaming/examples/advanced-stream-hevc.html, список воспроизведения: https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_adv_example_hevc/master.m3u8) Этот файл имеет следующую структуру:

ftyp
moov
    mvhd
    trak
        tkhd
        mdia
            mdhd
            hdlr
            minf
                vmhd
                dinf
                    dref
                stbl
                    stsd
                    stts
                    stsc
                    stsz
                    stco
    trak (same structure as above)
    mvex
        trex
moof-(1)
mdat
moof-(2)
mdat 
...

Этот файл от Apple pl отлично работает в ffmpeg и QuickTime / Safari. За исключением второго атома trak, он имеет ту же структуру.

"Хороший" файл: https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_adv_example_hevc/v14/main.mp4 (он предназначен для использования в списке воспроизведения HLS, который я скачал с помощью curl)

"Плохой" файл: https://www.transfernow.net/ddl/fmp4_bad (ссылка должна работать, тестировал только сейчас :)). На видео показан медленно вращающийся лист бумаги.

Есть предложения, в чем проблема с моим файлом? Заранее спасибо!

1 Ответ

0 голосов
/ 06 августа 2020

Продолжительность в moof-> traf-> trun-> entry-> duration неверна.

Так и moof-> traf-> tfhd-> default_sample_duration.

Похоже больше похоже на временную метку, но это должна быть продолжительность кадра.

У вас есть только одна выборка на фрагмент, что законно, но довольно расточительно.

...