我正在使用 HTML5 视频元素编写一个简单的 mpeg-dash 流媒体播放器。我正在创建MediaSource并将其附加SourceBuffer到它。然后我将破折号片段附加到这个源缓冲区中,一切正常。
现在,我想要做的是,我想根据媒体元素的当前时间动态预取这些片段。这样做时有很多疑问,MediaSource文档没有回答这些疑问。
是否可以知道 sourceBuffer 一次可以支持多少数据?如果我有一个非常大的视频并将所有片段附加到源缓冲区中,它会容纳所有片段或导致错误还是会降低浏览器的速度?
如何计算源缓冲区中的片段数?
如何计算最后一个片段的呈现时间或结束时间SourceBuffer?
我们如何仅从中删除特定的片段集SourceBuffer并将其替换为具有其他分辨率的片段?(我想这样做是为了支持自适应分辨率切换运行时。)
谢谢。
我在OSX上使用ffmpeg 2.8.
我尝试将短mp4视频转换为webm以进行自适应流媒体,如此处所建议的http://wiki.webmproject.org/adaptive-streaming/instructions-to-playback-adaptive-webm-using-dash如下:
VP9_DASH_PARAMS="-tile-columns 6 -frame-parallel 1"
ffmpeg -i t2.mp4 -c:v libvpx-vp9 -s 160x90 -b:v 250k -keyint_min 150 -g 150 ${VP9_DASH_PARAMS} -an -f webm -dash 1 video_160x90_250k.webm
ffmpeg -i t2.mp4 -c:a libvorbis -b:a 128k -vn -f webm -dash 1 audio_128k.webm
ffmpeg \
-f webm_dash_manifest -i video_160x90_250k.webm \
-f webm_dash_manifest -i audio_128k.webm \
-c copy -map 0 -map 1 \
-f webm_dash_manifest \
-adaptation_sets "id=0,streams=0 id=1,streams=1" \
manifest.mpd
Run Code Online (Sandbox Code Playgroud)
但是这给了我一个未指定像素格式的警告:
[webm_dash_manifest @ 0x7f9414812800] Could not find codec parameters …Run Code Online (Sandbox Code Playgroud) 正如我将上述协议归结为1或2个句子一样,我希望有人能够回答:用外行人的话说,MPEG-DASH和RTSP有什么区别?
从高层次来看,MPEG-DASH似乎是RTSP + RTP + RTCP + SDP的替代品.
关于自适应流媒体播放器的行为(具体地说我对HLS和DASH感兴趣),它应该多久重新加载播放列表?这是指定还是由播放器实现?
当它重新加载播放列表时,是仅针对所谓的变体播放列表还是每次重新加载主节点?
这对于直播和点播内容有何不同?
我正在研究一个星期,找到一个简单且独立于平台的方法来将mp4文件流式传输到任何浏览器.在浏览器不兼容的情况下,将使用渐进流(直接下载)方法.我的情况是这样的:
在研究Apple HLS,Adobe Flash Stream,Microsoft Smooth,RTSP和MPEG-DASH之后,似乎MPEG-DASH是正确的解决方案.但问题是MPEG-DASH迫使我将mp4文件拆分为单独的分段文件,这导致存储mp4文件的重复消耗空间,因为在浏览器不兼容的情况下我必须支持渐进式流.然后存储带有分段mp4文件的单个mp4文件是不可避免的.
问题是:有没有办法在任何浏览器中将单个 mp4文件作为http流和渐进流提供?
MPEG-DASH协议表示它支持多路复用文件,但问题是dash.js不支持它.有没有其他javascript播放器支持带字节范围请求的多路复用和单个mp4文件?
任何其他提交我的场景条件的解决方案都受到欢迎.谢谢.
参考文献: BitCodin.com 1 BitCodin.com 2
我在媒体服务器上使用arut nginx-rtmp-module(https://github.com/arut/nginx-rtmp-module),然后尝试使用FFmpeg流式传输到dash应用程序,然后通过使用播放流来测试流VLC。
它等待大约30秒才能开始播放,并且从头开始播放,而不是当前时间戳。
这是我当前在RTMP块上的配置
rtmp {
server {
listen 1935;
application live {
live on;
exec ffmpeg -re -i rtmp://localhost:1935/live/$name
-c:a libfdk_aac -b:a 32k -c:v libx264 -b:v 128K -f flv rtmp://localhost:1935/hls/$name_low
-c:a libfdk_aac -b:a 64k -c:v libx264 -b:v 256k -f flv rtmp://localhost:1935/hls/$name_mid
-c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 512K -f flv rtmp://localhost:1935/hls/$name_hi
-c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 512K -f flv rtmp://localhost:1935/dash/$name_dash;
}
application hls {
live on;
hls on;
hls_path /tmp/hls;
hls_nested on; …Run Code Online (Sandbox Code Playgroud) 我创建了一个测试 html 页面来播放 MPEG-CENC 保护的 MPEG-DASH 视频,如果我在player.configure() 中指定kid: 密钥对,我就可以播放。
然后我想设置一个clearkey服务器。请参阅Shaka Player 文档的DRM 配置部分,我更改了代码以指定获取许可证的 url,如下所示。但是当我在 Visual Studio 中的 Page_Load 事件中设置断点时,页面永远不会被触及。浏览器控制台没有错误。
我使用的浏览器是Firefox 53.0.2和Chrome 58.0.3029.96。我错过了什么?
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/shaka-player/2.1.0/shaka-player.compiled.js"></script>
<title>MPEG-DASH Player Test</title>
<script>
//MPEG-DASH stream encrypted with MPEG-CENC:
var manifestUri = '/dashtest_encrypted/stream.mpd';
function initApp() {
// Install built-in polyfills to patch browser incompatibilities.
shaka.polyfill.installAll();
// Check to see if the browser supports the basic APIs Shaka needs.
if (shaka.Player.isBrowserSupported()) {
// Everything looks good!
initPlayer();
} …Run Code Online (Sandbox Code Playgroud) 我只是无法弄清楚 shaka 播放器如何能够解密我的 CENC 保护内容,即使我在播放器配置中提供了无效的解密密钥。
player.configure({
drm: {
clearKeys: {
'6FepeJBbmaiozSMs18vPfA==': '6FepeJBbmaiozSMs18vPfA==', // ==> invalid key
'6FepeJBbmaiozSMs18vPfA==': '6FepeJBbmaiozSMs18vPfA==', // ==> invalid key
}
}
})
Run Code Online (Sandbox Code Playgroud)
这是给打包程序的参数
packager in=video-SD.webm,stream=audio,output=protected_audio.webm,drm_label=AUDIO in=video-HD.
webm,stream=video,output=protected_video_HD.webm,drm_label=HD in=video-SD.webm,stream=video,output=prote
cted_video_SD.webm,drm_label=SD --enable_raw_key_encryption --enable_raw_key_decryption \
--keys label=AUDIO:key_id=f3c5e0361e6654b28f8049c778b23946:key=a4631a153a443df9eed0593043db7519, label=SD:key_id=abba271e8bcf552bbd2e86a434a9a5d9:key=69eaa802a6763af979e8d1940fb88392,label=HD:key_id=abba271e8bcf552bbd2e86a434a9a5d9:key=69eaa802a6763af979e8d1940fb88392 \
--base_urls https://s3-eu-west-1.amazonaws.com/dash/ \
--mpd_output h264.mpd
Run Code Online (Sandbox Code Playgroud)
mpd 文件看起来像
<?xml version="1.0" encoding="UTF-8"?>
<!--Generated with https://github.com/google/shaka-packager version 72c4797-release-->
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT5.539000034332275S">
<BaseURL>https://s3-eu-west-1.amazonaws.com/dash/</BaseURL>
<Period id="0">
<AdaptationSet id="0" contentType="audio" lang="en" subsegmentAlignment="true">
<ContentProtection schemeIdUri="urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b" cenc:default_KID="f3c5e036-1e66-54b2-8f80-49c778b23946">
<cenc:pssh>AAAAVHBzc2gBAAAAEHfv7MCyTQKs4zweUuL7SwAAAAPzxeA2HmZUso+AScd4sjlGq7onHovPVSu9LoakNKml2au6Jx6Lz1UrvS6GpDSppdkAAAAA</cenc:pssh>
</ContentProtection>
<Representation id="0" bandwidth="96897" …Run Code Online (Sandbox Code Playgroud) 我当前正在解析 MPEG-DASH 流初始化段(由 FFMPEG 生成),我注意到时间刻度是在我的文件中的多个不同位置指定的:
为什么在这么多不同的地方指定它?为什么他们有不同的价值观?这些价值有等级吗?例如,60 是否会覆盖 15360,15360 是否会覆盖 1000?
这是我用来生成我正在查看的文件的命令:
ffmpeg -f v4l2 -pixel_format yuyv422 -vcodec rawvideo -framerate 30 -video_size 640x360 -i /dev/video0 \
-f dash -remove_at_exit false -use_template true -use_timeline true -streaming true -window_size 5 -extra_window_size 5 -seg_duration 5 -vcodec libx264 -b:v 1M -maxrate 1M -bufsize 2M -pix_fmt yuv420p -r 30 -s 640x360 -aspect 16:9 /var/www/html/media/live.mpd
Run Code Online (Sandbox Code Playgroud)