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

标签 video ffmpeg mp4 quicktime fmp4

我使用 VideoToolbox 和 CoreMedia 在 Swift 中编码了一个 fMP4-Video (HEVC)。产生的碎片 MP4 仅在 VLC 中播放。
我用来编写 fMP4 的库是这个 GitHub 项目的 HEVC 改编版本:https://github.com/krad/morsel
编码和写入过程:

  • VideoToolbox:编码SampleBuffer来自相机(VTCompressionSession,如 WWDC 2014 Session 513 中所述)
  • 使用 CoreMedia - 获取编码流元数据的函数(例如 CMVideoFormatDescriptionGetHEVCParameterSetAtIndexCMVideoFormatDescriptionGetDimensions )。我正在写CMFormatDescriptionGetExtension(description, extensionKey: "SampleDescriptionExtensionAtoms" as CFString)["hvcC"]的内容直接到hvcC盒子。这个盒子显然写得对,当我改变mp4的盒子的一个位时,QuickTime会抛出一个错误。
  • 我将样本缓冲区数据附加到 morsel 库,该库管理碎片并创建 moof 和 mdat 原子。

  • 结果文件可以在 VLC 中播放,而我只是让播放“运行”而不做任何事情。当我在 VLC 中滚动时间时,VLC 崩溃并且播放停止。
    它在 Safari 和 QuickTime 中也是一种“可播放”(不显示错误消息,播放窗口打开并显示文件的正确长度,我什至可以更改播放时间/播放/暂停,但没有显示视频. 窗口仍然是空的。这就是我遇到的问题。我需要在 Safari 和 QuickTime 中运行 fMP4。
    该文件在 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 
    ...
    
    我要创建的结果文件应该类似于此 HLS 播放列表中提供的 fMP4:(示例: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 的文件可以在 ffmpeg 和 QuickTime/Safari 中完美播放。除了第二个trak原子,它具有相同的结构。
    “好”文件是:https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_adv_example_hevc/v14/main.mp4 (它适用于我用 curl 下载的 HLS 播放列表)
    “坏”文件是:https://www.transfernow.net/ddl/fmp4_bad (链接应该可以工作,刚刚测试过:))。视频显示一张缓慢旋转的纸。
    有什么建议我的文件有什么问题吗?
    提前致谢!

    最佳答案

    moof->traf->trun->entries->duration 中的持续时间是错误的。
    moof->traf->tfhd->default_sample_duration 也是如此。
    它看起来更像是一个时间戳,但它应该是帧持续时间。
    每个片段只有一个样本,这是合法的,但非常浪费。

    关于video - 碎片 MP4 不在 ffplay/QuickTime/Safari 中播放,但在 VLC 中播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63262104/

    相关文章:

    javascript - <cfmediaplayer> 如何通过 javascript 调用暂停播放器?

    iphone - iPhone 支持的视频文件格式

    javascript - HTML5 视频在本地正常工作但在托管服务器上不正常

    c - 如何通过ffmpeg将mp3解码为pcm

    c# - 如何将参数传递给c#中的现有流程实例

    c# - 视频转换时间过长

    c++ - 无法使用 FFmpeg 编码单帧 h264 (.mp4) 视频。不存在视频流

    javascript - 如何使用 Javascript 暂停视频

    javascript - 在 JavaScript 中创建 MP4 视频

    iPhone MP4 视频播放列表