【问题标题】:FFMPEG : Redirecting Matroska muxed data to socketFFMPEG:将 Matroska 混合数据重定向到套接字
【发布时间】:2016-08-14 09:35:37
【问题描述】:

我正在使用 FFMPEG 库将 H.264 和 AAC 帧复用到 Matroska (.mkv) 文件。我可以使用命令行和 C 程序来做到这一点。

现在,我不想将混合的 matroska 数据写入文件,而是将这些混合数据直接写入套接字或管道。我的实际目标是编写一个 C 程序,将混合数据发送到套接字,服务器将接收这些混合数据。

我尝试使用协议 tcp。他们正在使用 matroska 格式。 因此,我的 C 程序能够通过套接字成功发送混合数据,并且服务器能够接收这些混合数据。

但是当我对收到的文件应用 ffprobe 命令时,我得到持续时间和比特率字段 N/A。当我尝试使用 vlc 播放此文件时,我无法找到该文件并获得垃圾持续时间。

在 ffprobe 的输出下方。

ffprobe version N-65784-g50a35f0 Copyright (c) 2007-2014 the FFmpeg developers
  built on Aug 25 2014 12:31:36 with gcc 4.7 (Ubuntu/Linaro 4.7.3-1ubuntu1)
  configuration: 
  libavutil      54.  5.100 / 54.  5.100
  libavcodec     56.  0.101 / 56.  0.101
  libavformat    56.  1.100 / 56.  1.100
  libavdevice    56.  0.100 / 56.  0.100
  libavfilter     5.  0.101 /  5.  0.101
  libswscale      3.  0.100 /  3.  0.100
  libswresample   1.  1.100 /  1.  1.100
Input #0, matroska,webm, from 'Array.mkv':
  Metadata:
    ENCODER         : Lavf54.29.104
  Duration: N/A, start: 1412858260.281000, bitrate: N/A
    Stream #0:0: Video: mjpeg, yuvj422p(pc, bt470bg), 2000x1496 [SAR 1:1 DAR 250:187], 27 fps, 27 tbr, 1k tbn, 1k tbc (default)
    Stream #0:1: Video: mjpeg, yuvj422p(pc, bt470bg), 2000x1496 [SAR 1:1 DAR 250:187], 27 fps, 27 tbr, 1k tbn, 1k tbc (default)
    Stream #0:2: Video: mjpeg, yuvj422p(pc, bt470bg), 2000x1496 [SAR 1:1 DAR 250:187], 27 fps, 27 tbr, 1k tbn, 1k tbc (default)
    Stream #0:3: Video: mjpeg, yuvj422p(pc, bt470bg), 2000x1496 [SAR 1:1 DAR 250:187], 27 fps, 27 tbr, 1k tbn, 1k tbc (default)

如您所见,持续时间和比特率字段显示 N/A。但是我得到了正确的开始时间。

有什么帮助或建议吗?提前谢谢你。

【问题讨论】:

    标签: c sockets ffmpeg vlc


    【解决方案1】:

    这不太可能奏效,因为:

    • 复用到 MKV 文件并不意味着所有内容都按顺序写入文件。 MKV Meta Seek 块和 Cue 块(玩​​家需要寻找)可能仅在生成整个文件后才更新。事实上,根据MKV spec,Cue 块被放置在 MKV 的末尾,所以它只有在几乎整个文件都被写入之后才生成的。

    • 在流上运行 ffprobe 不适用于所有容器格式,因为这意味着 ffprobe 无法随机访问文件内容。它可能适用于在开头放置元信息的文件(例如 qt-faststart 处理的 MP4),但不会像您预期的那样适用于 MKV 等格式。

    【讨论】:

    • @ParthShah 请考虑接受我的回答 ;) 如果您确实需要多路复用进行流式传输,请考虑使用支持流式传输的格式,例如 FLV。当然你仍然不能在流中寻找,但至少它会正常播放。
    • @ParthShah 获得持续时间恐怕你必须要么 a) 将完整文件复用到 MP4,qt-faststart 然后流式传输它,或者 b) 开发一个简单的协议自己在开始时发送基本的元数据,例如持续时间。
    【解决方案2】:

    对于 mp4,其容器需要在文件开头写入附加信息。而这件事用网络Socket是做不到的。所以我们不能在这里使用 MP4 容器。

    【讨论】:

    • 是的...你是对的 MP4 容器不支持将混合数据写入标准输出,因为 Mp4 容器必须来回移动才能写入原子。
    猜你喜欢
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多