我们运行视频服务,将电影流式传输到智能手机(iOS&Android)。我们使用H.264 + AAC编码,并使用mp4容器。我们有一个问题,即长电影(超过60分钟)需要很长的时间才能开始播放,并且已经跟踪到这些电影的Moov原子很大。对于110分钟的电影,原子大小高达4.2Mb,这显然需要很长时间才能通过3G下载到智能手机!
无论如何,可以使moov原子变小吗?我们可以通过降低音频采样率来降低比特率,但是显然任何低于22kHz的东西都是不可接受的。
我们使用ffmpeg作为编码器,并使用MP4Box将元数据移动到文件的开头。有没有办法使它变小?还有其他编码器可以使运动幅度减小吗?
例如...
大(280 Mb,1h 49min)可流mp4(h.264,AAC)文件的标头大(4.2 Mb)。通过两次传递ffmpeg和MP4Box对文件进行编码,以将元数据替换为文件的开头:
/usr/bin/ffmpeg -i /var/lib/encoder/incoming/2388 -aspect 320:210 -threads 8 -vcodec libx264 -profile baseline -level 13 -flags +loop+mv4 -cmp 256 -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 -me_method hex -subq 7 -trellis 1 -refs 5 -bf 0 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10 -qmax 51 -qdiff 4 -b:v 270k -maxrate 270k -bufsize 270k -g 30 -passlogfile /tmp/mediaservice/3100/video-IPH.ffmpeg -an -f rawvideo -pass 1 -y /dev/null
/usr/bin/ffmpeg -i /var/lib/encoder/incoming/2388 -aspect 320:210 -threads 8 -vcodec …
Run Code Online (Sandbox Code Playgroud) 我有一个 IP 摄像头 (VisionTech VN6xSM3Ti),它返回 H.264 原始数据的视频流,我如何使用此流创建可通过 HTML5 浏览器访问的实时流?
要访问摄像机流,我必须遵循制造商提供的指定协议,因此并不像仅使用 IP 地址访问它那么容易。
我已经在 C# 和 C 中编写了将相机流作为字节数组读取的代码,但我不知道如何继续。
我一直在考虑用 Node.JS 解决它,我的代码如下:
IP 摄像机原始数据 ---> 我的代码 --- 本地套接字 --> Node.js --- ?? ---> 客户
有谁知道这是否可以做到?或者是否有更好的选择?
我有一个在浏览器中播放的 HLS 流。我想要做的是有一个像这样的 URL,/stream.mp4
可以从当前时间点将直播回放为碎片 mp4。这样您就可以将流下载为单个文件,并且无需任何 js 依赖即可运行。
我想到的方法是:
ffmpeg
(我知道你可以连接.ts
片段,但它们不能在 Firefox 中播放。)
这个答案描述了当您手头有所有片段时如何创建碎片mp4(tl;dr use -movflags frag_keyframe+emptymoov
)。但我想动态执行此操作,以便每个新的 HLS 片段在创建后立即转换为 mp4 片段。
我认为这与 DASH 本身的做法类似,chunk-$n.m4s
可以附加任何块init.m4s
,并且它将是一个适当的碎片 mp4。但这可以在不使用 DASH 的情况下完成吗?
如何将 ts 片段转复用为 mp4 片段?
编辑:我找到了一种做我想做的事情的方法,但不是通过将 mpegts 片段转换为 fmp4。事实证明,HLS 的更高版本确实支持分段 mp4(就像 DASH 一样),并且 FFmpeg-hls_segment_type fmp4
为此提供了选项。
我似乎想将我想在网站上流式传输的音频转换为audio/mp4; codecs="mp4a.40.2"
.
使用ffmpeg-cli-wrapper
,我在此处使用以下命令转换我上传的音频文件:
ffmpeg -i /tmp/input.any -acodec aac -b:a 256000 /tmp/output.aac
Run Code Online (Sandbox Code Playgroud)
在客户端上,我创建一个像这样的 SourceBuffer:
ffmpeg -i /tmp/input.any -acodec aac -b:a 256000 /tmp/output.aac
Run Code Online (Sandbox Code Playgroud)
错误是:
铬合金:
NotSupportedError: Failed to load because no supported source was found.
Run Code Online (Sandbox Code Playgroud)
火狐浏览器:
NotSupportedError: The media resource indicated by the src attribute or assigned media provider object was not suitable.
Run Code Online (Sandbox Code Playgroud)
audio/aac
如果我使用mime-type创建 SourceBuffer :
this.sourceBuffer = this.mediaSource.addSourceBuffer('audio/mp4; codecs="mp4a.40.2"');
Run Code Online (Sandbox Code Playgroud)
音频在 Chrome 上正确播放,但 Firefox 说:
MediaSource.addSourceBuffer: Type not supported in MediaSource
Run Code Online (Sandbox Code Playgroud)
将命令更改为后
ffmpeg -i /tmp/input.any …
Run Code Online (Sandbox Code Playgroud)