簡體   English   中英

碎片 MP4 不在 ffplay/QuickTime/Safari 中播放,但在 VLC 中播放

[英]Fragmented MP4 not playing in ffplay/QuickTime/Safari, but in VLC

我使用 VideoToolbox 和 CoreMedia 在 Swift 中編碼了 fMP4-Video (HEVC)。 產生的碎片 MP4 僅在 VLC 中播放。

我用來編寫 fMP4 的庫是這個 GitHub 項目的 HEVC 適配版本: https://github.com/krad/morsel

編碼和寫入過程:

  1. VideoToolbox:從相機編碼SampleBufferVTCompressionSession ,如 WWDC 2014 Session 513 中所述)
  2. 使用CoreMedia -Functions(例如CMVideoFormatDescriptionGetHEVCParameterSetAtIndexCMVideoFormatDescriptionGetDimensions )來獲取編碼流元數據。 我正在將CMFormatDescriptionGetExtension(description, extensionKey: "SampleDescriptionExtensionAtoms" as CFString)["hvcC"]的內容直接寫入 hvcC 框。 這個盒子顯然寫得對,當我改變mp4的盒子的一個位時,QuickTime會拋出一個錯誤。
  3. 我將樣本緩沖區數據附加到 morsel 庫,該庫管理碎片並創建 moof 和 mdat 原子。

結果文件可以在 VLC 中播放,而我只是讓播放“運行”而不做任何事情。 當我在 VLC 中滾動時間時,VLC 崩潰並且播放停止。

它在 Safari 和 QuickTime 中也有點“可播放”(沒有顯示錯誤消息,播放 window 打開並顯示文件的正確長度,我什至可以更改播放時間/播放/暫停,但沒有顯示視頻. window 仍然是空的。這就是我遇到的問題。我需要在 Safari 和 QuickTime 中運行 fMP4。

該文件在 ffplay 中根本沒有播放(使用 ffmpeg 轉換時同樣的問題)。 顯示播放時間的行仍然是nan MV: nan fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0 ,沒有錯誤消息。 播放只是沒有開始。 使用 ffplay 播放文件時,這是 output:

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 
...

The result file I want to create should be like the fMP4 served within this HLS playlist: (Example: https://developer.apple.com/streaming/examples/advanced-stream-hevc.html , Playlist: https://devstreaming -cdn.apple.com/videos/streaming/examples/bibpbop_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 的文件可以在 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 (鏈接應該可以工作,剛剛測試過:))。 視頻顯示一張緩慢旋轉的紙。

有什么建議我的文件有什么問題嗎? 提前致謝!

moof->traf->trun->entries->duration 中的持續時間是錯誤的。

moof->traf->tfhd->default_sample_duration 也是如此。

它看起來更像是一個時間戳,但它應該是幀持續時間。

每個片段只有一個樣本,這是合法的,但非常浪費。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM