我想将fMP4片段转换为TS段(用于HLS),因为片段是在iOS设备上使用FFmpeg编写的.
我正在尝试在iOS上实现实时上传,同时在本地保持无缝的高清副本.
滚动AVAssetWriters,每次写入8秒,然后通过FFmpeg连接MP4.
出了什么问题 - 音频和视频有时会出现问题.我已经确定了3个原因.
1)为AAC编码器写入的音频启动帧,从而产生间隙.
2)由于视频帧长33.33ms,音频帧长0.022ms,因此它们可能不在文件末尾排队.
3)Mac OS上缺少帧精确编码,但iOS 详细信息不适用于此
FFmpeg将具有原始音频的大视频MP4文件复用到TS段中.这项工作基于Kickflip SDK
什么是错的 - 每隔一段时间,只有一个音频文件会上传,没有任何视频.永远不能在内部重现它,但当他们没有记录他们认为他们做的事情时,它对我们的用户来说非常令人沮丧.在最后一段上也存在准确搜索的问题,几乎就像TS段的时间戳错误一样.
苹果公司今年(2016年)正在WWDC推动fMP4,在此之前我还没有对它进行太多调查.由于fMP4文件可以在写入时读取和播放,我认为FFmpeg也可以在写入时对文件进行转码,只要我们阻止将字节发送到FFmpeg直到每个片段内文件完成了.
但是,我对FFmpeg C API并不熟悉,我只是在尝试#2中简单地使用它.
AVFoundation已经完成在文件中写一个片段,以便我可以将它管道输入FFmpeg?将 HEVC 视频复用到分段 MP4 以使用 MPEG-DASH/HLS 进行流式传输时,如何选择要使用的正确编解码器标签(hvc1或)?hev1
我认为根据标签的不同,复用略有不同ISO/IEC FDIS 14496-15:
当示例条目名称为“hvc1”时,对于所有类型参数集的数组,array_completeness 的默认强制值为 1,对于所有其他数组,默认强制值为 0。当样本条目名称为“hev1”时,所有数组的 array_completeness 默认值为 0。
除了这个还有别的吗?
为什么有两个标签,在这两个标签之间选择的标准是什么?
旁注:出于某种原因, Apple 更喜欢hvc1根据其HLS 创作规范。
我尝试用原始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) 目前,使用libavformat从代码生成碎片化MP4文件时遇到问题.我的文件可以使用VLC播放,但无法在(Chrome)浏览器中流式传输(通过WebSocket)和播放(通过MediaSource).(我用它来通过WebSocket测试流式分段MP4文件到浏览器).
注意:下面的文件由Baseline profile 4级编码.因此,您应该将MIME类型(在index.html中)更改为const mimeCodec ='video/mp4; 编解码器= "avc1.42C028"'; 能够发挥它们.
我检查并发现我生成的Mp4文件与使用ffmpeg工具生成的文件略有不同.
这就是我所做的:
我有一个.h264 文件
第一种方法,我使用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播放器播放
第二种方法,我使用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)此用例是一项服务,手动将一系列未压缩的 .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) 我有一个 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
fmp4 ×6
ffmpeg ×4
c++ ×2
libavformat ×2
mpeg-dash ×2
avfoundation ×1
format ×1
h.264 ×1
hevc ×1
ios ×1
media-source ×1
mp4 ×1
mp4parser ×1