标签: fmp4

使用FFmpeg在iOS上编写时将fMP4转码为HLS

TL; DR

我想将fMP4片段转换为TS段(用于HLS),因为片段是在iOS设备上使用FFmpeg编写的.

为什么?

我正在尝试在iOS上实现实时上传,同时在本地保持无缝的高清副本.

我试过的

  1. 滚动AVAssetWriters,每次写入8秒,然后通过FFmpeg连接MP4.

    出了什么问题 - 音频和视频有时会出现问题.我已经确定了3个原因.

    1)为AAC编码器写入的音频启动帧,从而产生间隙.

    2)由于视频帧长33.33ms,音频帧长0.022ms,因此它们可能不在文件末尾排队.

    3)Mac OS上缺少帧精确编码,但iOS 详细信息不适用于此

  2. FFmpeg将具有原始音频的大视频MP4文件复用到TS段中.这项工作基于Kickflip SDK

    什么是错的 - 每隔一段时间,只有一个音频文件会上传,没有任何视频.永远不能在内部重现它,但当他们没有记录他们认为他们做的事情时,它对我们的用户来说非常令人沮丧.在最后一段上也存在准确搜索的问题,几乎就像TS段的时间戳错误一样.

我现在在想什么

苹果公司今年(2016年)正在WWDC推动fMP4,在此之前我还没有对它进行太多调查.由于fMP4文件可以在写入读取和播放,我认为FFmpeg也可以在写入时对文件进行转码,只要我们阻止将字节发送到FFmpeg直到每个片段内文件完成了.

但是,我对FFmpeg C API并不熟悉,我只是在尝试#2中简单地使用它.

我需要你什么

  1. 这是可行的解决方案吗?有人对fMP4足够熟悉,知道我是否真的可以做到这一点?
  2. 我怎么知道AVFoundation已经完成在文件中写一个片段,以便我可以将它管道输入FFmpeg?
  3. 如何从磁盘上的文件中获取数据,一次块,将其传递给FFmpeg并让它吐出TS段?

ffmpeg avfoundation http-live-streaming ios fmp4

57
推荐指数
1
解决办法
1774
查看次数

fMP4、hvc1 或 hev1 使用什么 HEVC 编解码器标签?

将 HEVC 视频复用到分段 MP4 以使用 MPEG-DASH/HLS 进行流式传输时,如何选择要使用的正确编解码器标签(hvc1或)?hev1

我认为根据标签的不同,复用略有不同ISO/IEC FDIS 14496-15

当示例条目名称为“hvc1”时,对于所有类型参数集的数组,array_completeness 的默认强制值为 1,对于所有其他数组,默认强制值为 0。当样本条目名称为“hev1”时,所有数组的 array_completeness 默认值为 0。

除了这个还有别的吗?

为什么有两个标签,在这两个标签之间选择的标准是什么?

旁注:出于某种原因, Apple 更喜欢hvc1根据其HLS 创作规范。

video-streaming http-live-streaming hevc mpeg-dash fmp4

8
推荐指数
1
解决办法
1万
查看次数

碎片化MP4 - 在浏览器中播放问题

我尝试用原始H264视频数据创建碎片化的MP4,这样我就可以在互联网浏览器的播放器中播放它了.我的目标是创建实时流媒体系统,媒体服务器将片段化的MP4片段发送到浏览器.服务器将缓冲来自RaspberryPi摄像头的输入数据,该摄像头将视频作为H264帧发送.然后它将复用该视频数据并使其可供客户端使用.浏览器将使用Media Source Extensions播放媒体数据(由服务器复制并通过websocket发送).

出于测试目的,我编写了以下代码片段(使用我在intenet中找到的许多示例):

使用avcodec的C++应用程序,它将原始H264视频复用到碎片MP4并将其保存到文件中:

#define READBUFSIZE 4096
#define IOBUFSIZE 4096
#define ERRMSGSIZE 128

#include <cstdint>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

extern "C"
{
    #include <libavformat/avformat.h>
    #include <libavutil/error.h>
    #include <libavutil/opt.h>
}

enum NalType : uint8_t
{
    //NALs containing stream metadata
    SEQ_PARAM_SET = 0x7,
    PIC_PARAM_SET = 0x8
};

std::vector<uint8_t> outputData;

int mediaMuxCallback(void *opaque, uint8_t *buf, int bufSize)
{
    outputData.insert(outputData.end(), buf, buf + bufSize);
    return bufSize;
}

std::string getAvErrorString(int errNr)
{
    char errMsg[ERRMSGSIZE];
    av_strerror(errNr, errMsg, ERRMSGSIZE);
    return std::string(errMsg);
} …
Run Code Online (Sandbox Code Playgroud)

c++ ffmpeg h.264 libavformat fmp4

6
推荐指数
1
解决办法
1044
查看次数

ffmpeg和代码生成的碎片化的mp4文件不同

目前,使用libavformat从代码生成碎片化MP4文件时遇到问题.我的文件可以使用VLC播放,但无法在(Chrome)浏览器中流式传输(通过WebSocket)和播放(通过MediaSource).(我用来通过WebSocket测试流式分段MP4文件到浏览器).

注意:下面的文件由Baseline profile 4级编码.因此,您应该将MIME类型(在index.html中)更改为const mimeCodec ='video/mp4; 编解码器= "avc1.42C028"'; 能够发挥它们.

我检查并发现我生成的Mp4文件与使用ffmpeg工具生成的文件略有不同.

这就是我所做的:

我有一个.h264 文件

  1. 第一种方法,我使用ffmpeg生成碎片化的MP4文件.

    ffmpeg -i temp.h264 -vcodec copy -f mp4 -movflags empty_moov+default_base_moof+frag_keyframe ffmpeg.mp4
    
    Run Code Online (Sandbox Code Playgroud)

    生成的文件可以由Quicktime播放器和VLC播放器播放

  2. 第二种方法,我使用libavformat以 programmaticaly方式生成碎片化的Mp4文件

    首先我初始化上下文,codecin代码是AVCodecContext*输入流的

     av_register_all();
     avcodec_register_all();
     int ret;
     AVOutputFormat* fmt = av_guess_format("mp4", 0, 0);
     if(!fmt) {
       return;
     }
    
     AVFormatContext* ctx = avformat_alloc_context();
     // Create AVIO context to capture generated Mp4 contain
     uint8_t *avio_ctx_buffer = NULL;
     size_t avio_ctx_buffer_size = 50000;
     IOOutput buffer = {};
     const …
    Run Code Online (Sandbox Code Playgroud)

c++ ffmpeg libavformat media-source fmp4

5
推荐指数
1
解决办法
1128
查看次数

Java mp4parser 创建单个 .m4s 片段 - 无效的 moov 框

此用例是一项服务,手动将一系列未压缩的 .wav 媒体片段编码为.m4s片段,以便通过MPEG-DASH广播,使用ffmpeg将 .wav 压缩为 .aac,并使用sannies/mp4parser将 aac 音频组装为 .m4s 片段。 m4s媒体片段。

我创建了这个公共 GitHub 项目来完整重现该问题。

例如,下面是自定义CustomFragmentMp4Builder.java类。

至关重要的是,我们能够使用序列号(索引)来指定这个单个 .m4s 片段,我们将为每个媒体片段手动递增该序列号。

目标是构建一个包含框类型、和 的.m4s片段。作为参考,我使用mp4parser来检查通过 生成的.m4s片段。该规范可在此处以 .yaml 文件形式提供SegmentTypeBoxSegmentIndexBoxMovieFragmentBoxffmpeg -f hls

我的实现创建 MP4 时没有错误。但是,当单元测试尝试读取 ChunkMp4Builder 刚刚写入临时文件夹的文件时:

java.lang.RuntimeException: A cast to int has gone wrong. Please contact the mp4parser discussion group (3724673092)
    at org.mp4parser.tools.CastUtils.l2i(CastUtils.java:30)
    at org.mp4parser.support.AbstractBox.parse(AbstractBox.java:97)
    at org.mp4parser.AbstractBoxParser.parseBox(AbstractBoxParser.java:116)
    at org.mp4parser.BasicContainer.initContainer(BasicContainer.java:107)
    at …
Run Code Online (Sandbox Code Playgroud)

mp4 ffmpeg mp4parser mpeg-dash fmp4

5
推荐指数
1
解决办法
659
查看次数

HTTP 实时流媒体:碎片化的 MP4 还是 MPEG-TS?

我有一个 IP 摄像机,它通过 UDP 在 RTSP 中发送实时流,我想在浏览器中显示这个流,我希望它可以在主要浏览器和移动设备(iO 和 Android)上运行。为了实现这一点,我想在将流发送到客户端之前将流转换为服务器上的 HTTP Live Streaming (HLS)。现在我读过不久前,Apple 添加了对分段 MP4 (fMP4) 作为流格式的支持,而通常流将以 MPEG-TS 格式发送。而fMP4也是MPEG-DASH支持的格式,几年后MPEG-DASH可能会成为行业标准。

现在我的问题是,fMP4 和 MPEG-TS 的优缺点是什么?

编辑:根据 Apple 的 HLS 技术说明,直播流必须编码为 MPEG-TS 流(https://developer.apple.com/library/content/technotes/tn2224/_index.html#//apple_ref/doc /uid/DTS40009745-CH1-ENCODEYOURVARIANTS)。是否有原因或此信息已过时?

format video-streaming live-streaming http-live-streaming fmp4

2
推荐指数
1
解决办法
3899
查看次数