Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 仅包含单个mp4文件的MPEG-DASH视频流_Javascript_Http_Video Streaming_Mpeg Dash_Dash.js - Fatal编程技术网

Javascript 仅包含单个mp4文件的MPEG-DASH视频流

Javascript 仅包含单个mp4文件的MPEG-DASH视频流,javascript,http,video-streaming,mpeg-dash,dash.js,Javascript,Http,Video Streaming,Mpeg Dash,Dash.js,我正在研究一周,以找到一种简单且独立于平台的方法,将mp4文件传输到任何浏览器。如果浏览器不兼容,将使用渐进式流(直接下载)方法。我的场景是这样的: 单个mp4文件(不分段和多路复用(音频+视频)) 支持HTTP字节范围服务 浏览器不兼容时支持渐进式流(直接文件下载) 在研究了Apple HLS、Adobe Flash Stream、Microsoft Smooth、RTSP和MPEG-DASH之后,似乎MPEG-DASH是合适的解决方案。但问题是MPEG-DASH迫使我将mp4文件拆分为单

我正在研究一周,以找到一种简单且独立于平台的方法,将mp4文件传输到任何浏览器。如果浏览器不兼容,将使用渐进式流(直接下载)方法。我的场景是这样的:

  • 单个mp4文件(不分段和多路复用(音频+视频))
  • 支持HTTP字节范围服务
  • 浏览器不兼容时支持渐进式流(直接文件下载)
在研究了Apple HLS、Adobe Flash Stream、Microsoft Smooth、RTSP和MPEG-DASH之后,似乎MPEG-DASH是合适的解决方案。但问题是MPEG-DASH迫使我将mp4文件拆分为单独的分段文件,这会导致重复占用存储mp4文件的空间,因为在浏览器不兼容的情况下,我必须支持渐进流。因此,将单个mp4文件与分段mp4文件一起存储是不可避免的

问题是:有没有办法在任何浏览器中将单个
mp4文件作为http流和渐进流提供服务

MPEG-DASH协议表示它支持多路复用文件,但问题是它不支持。是否有其他javascript播放器支持多路复用和单个mp4文件以及字节范围请求

欢迎提交我的场景条件的任何其他解决方案。 谢谢

参考资料:
是的,有一个解决方案。dash.js仅播放已打包的碎片化MP4。然而,Telecom Paristech Cyril的这个项目将满足您的需求:

这是mp4box的js版本。它所能做的是将非碎片化的mp4动态转换为媒体片段,然后将其馈送到MSE sourceBuffer。他们有一个示例播放器,您可以复制它:

干杯
我想所有主流浏览器都支持mp4。您可以使用一个好的旧http服务器对其进行流式处理<代码>MPEG-DASH仅当您需要诸如自适应比特率流、多语言、drm等新奇的东西时才需要


如果您坚持使用
MPEG-DASH
,您只需在服务器端使用一个文件段即可(只需执行一次)。结果不是多个mp4文件,而是单个mp4文件,该文件以更适合流媒体的方式组织。

您可以为dash player提供单个mp4文件。但是,您需要将索引信息放入此mp4文件的sidx框中。你可以用便当来做这件事。实际上,对于ondemand的情况,通常使用一个文件来流式处理。您也可以在本地下载此文件。
如果只有一个比特率,Dash流将不需要更多的存储大小。还有很多javascript播放器都支持dash,比如shakashaka播放器、dashif播放器……

也许这会对您有所帮助:

#!/bin/bash

# THIS SCRIPT CONVERTS EVERY MP4 (IN THE CURRENT FOLDER AND SUBFOLDER) TO A MULTI-BITRATE VIDEO IN MP4-DASH
# For each file "videoname.mp4" it creates a folder "dash_videoname" containing a dash manifest file "stream.mpd" and subfolders containing video segments.
# Explanation: 


# Validation tool:
# https://conformance.dashif.org/

# MDN reference:
# https://developer.mozilla.org/en-US/Apps/Fundamentals/Audio_and_video_delivery/Setting_up_adaptive_streaming_media_sources

# Add the following mime-types (uncommented) to .htaccess:
# AddType video/mp4 m4s
# AddType application/dash+xml mpd

# Use type="application/dash+xml" 
# in html when using mp4 as fallback:
#                <video data-dashjs-player loop="true" >
#                    <source src="/walking/walking.mpd" type="application/dash+xml">
#                    <source src="/walking/walking.mp4" type="video/mp4">
#                </video>

# DASH.js
# https://github.com/Dash-Industry-Forum/dash.js

MYDIR=$(dirname $(readlink -f ${BASH_SOURCE[0]}))
SAVEDIR=$(pwd)

# Check programs
if [ -z "$(which ffmpeg)" ]; then
    echo "Error: ffmpeg is not installed"
    exit 1
fi

if [ -z "$(which MP4Box)" ]; then
    echo "Error: MP4Box is not installed"
    exit 1
fi

cd "$MYDIR"

TARGET_FILES=$(find ./ -maxdepth 1 -type f \( -name "*.mov" -or -name "*.mp4" \))
for f in $TARGET_FILES
do
  fe=$(basename "$f") # fullname of the file
  f="${fe%.*}" # name without extension

  if [ ! -d "${f}" ]; then #if directory does not exist, convert
    echo "Converting \"$f\" to multi-bitrate video in MPEG-DASH"

    mkdir "${f}"

    ffmpeg -y -i "${fe}" -c:a aac -b:a 192k -vn "${f}_audio.m4a"

    ffmpeg -y -i "${fe}" -preset slow -tune film -vsync passthrough -write_tmcd 0 -an -c:v libx264 -x264opts 'keyint=25:min-keyint=25:no-scenecut' -crf 22 -maxrate 5000k -bufsize 12000k -pix_fmt yuv420p -f mp4 "${f}_5000.mp4"
    ffmpeg -y -i "${fe}" -preset slow -tune film -vsync passthrough -write_tmcd 0 -an -c:v libx264 -x264opts 'keyint=25:min-keyint=25:no-scenecut' -crf 23 -maxrate 3000k -bufsize 6000k -pix_fmt yuv420p -f mp4  "${f}_3000.mp4"
    ffmpeg -y -i "${fe}" -preset slow -tune film -vsync passthrough -write_tmcd 0 -an -c:v libx264 -x264opts 'keyint=25:min-keyint=25:no-scenecut' -crf 23 -maxrate 1500k -bufsize 3000k -pix_fmt yuv420p -f mp4   "${f}_1500.mp4"
    ffmpeg -y -i "${fe}" -preset slow -tune film -vsync passthrough -write_tmcd 0 -an -c:v libx264 -x264opts 'keyint=25:min-keyint=25:no-scenecut' -crf 23 -maxrate 800k -bufsize 2000k -pix_fmt yuv420p -vf "scale=-2:720" -f mp4  "${f}_800.mp4"
    ffmpeg -y -i "${fe}" -preset slow -tune film -vsync passthrough -write_tmcd 0 -an -c:v libx264 -x264opts 'keyint=25:min-keyint=25:no-scenecut' -crf 23 -maxrate 400k -bufsize 1000k -pix_fmt yuv420p -vf "scale=-2:540" -f mp4  "${f}_400.mp4"
    # static file for ios and old browsers
    ffmpeg -y -i "${fe}" -preset slow -tune film -vsync passthrough -write_tmcd 0 -c:a aac -b:a 160k -c:v libx264  -crf 23 -maxrate 2000k -bufsize 4000k -pix_fmt yuv420p -f mp4 "${f}/${f}.mp4"


    rm -f ffmpeg*log*
    # if audio stream does not exist, ignore it
    if [ -e "${f}_audio.m4a" ]; then
        MP4Box -dash-strict 2000 -rap -frag-rap  -bs-switching no -profile "dashavc264:live" "${f}_5000.mp4" "${f}_3000.mp4" "${f}_1500.mp4" "${f}_800.mp4" "${f}_400.mp4" "${f}_audio.m4a" -out "${f}/${f}.mpd"
        rm "${f}_5000.mp4" "${f}_3000.mp4" "${f}_1500.mp4" "${f}_800.mp4" "${f}_400.mp4" "${f}_audio.m4a"
    else
        MP4Box -dash-strict 2000 -rap -frag-rap  -bs-switching no -profile "dashavc264:live" "${f}_5000.mp4" "${f}_3000.mp4" "${f}_1500.mp4" "${f}_800.mp4" "${f}_400.mp4" -out "${f}/${f}.mpd"
        rm "${f}_5000.mp4" "${f}_3000.mp4" "${f}_1500.mp4" "${f}_800.mp4" "${f}_400.mp4" 
    fi
    # create a jpg for poster. Use imagemagick or just save the frame directly from ffmpeg is you don't have cjpeg installed.
    ffmpeg -i "${fe}" -ss 00:00:00 -vframes 1  -qscale:v 10 -n -f image2 - | cjpeg -progressive -quality 75 -outfile "${f}"/"${f}".jpg

    fi

done

cd "$SAVEDIR"
#/bin/bash
#此脚本将每个MP4(在当前文件夹和子文件夹中)转换为MP4-DASH中的多比特率视频
#对于每个文件“videoname.mp4”,它会创建一个文件夹“dash\u videoname”,其中包含一个dash清单文件“stream.mpd”和包含视频片段的子文件夹。
#说明:
#验证工具:
# https://conformance.dashif.org/
#MDN参考:
# https://developer.mozilla.org/en-US/Apps/Fundamentals/Audio_and_video_delivery/Setting_up_adaptive_streaming_media_sources
#将以下mime类型(未注释)添加到.htaccess:
#AddType视频/mp4 m4s
#AddType应用程序/dash+xml mpd
#使用type=“应用程序/dash+xml”
#在html中使用mp4作为回退时:
#                
#                    
#                    
#                
#DASH.js
# https://github.com/Dash-Industry-Forum/dash.js
MYDIR=$(dirname$(readlink-f${BASH_SOURCE[0]}))
SAVEDIR=$(pwd)
#检查程序
如果[-z“$(哪个ffmpeg)”;然后
echo“错误:未安装ffmpeg”
出口1
fi
如果[-z“$(哪个MP4Box)”;然后
echo“错误:未安装MP4Box”
出口1
fi
cd“$MYDIR”
TARGET_FILES=$(find./-maxdepth 1-type f\(-name“*.mov”-或-name“*.mp4”\))
对于$TARGET\u文件中的f
做
fe=$(basename“$f”)#文件的全名
f=“${fe%.*}”名称,不带扩展名
如果[!-d“${f}”];然后#如果目录不存在,则转换
echo“将\“$f\”转换为MPEG-DASH中的多比特率视频”
mkdir“${f}”
ffmpeg-y-i“${fe}”-c:aac-b:a 192k-vn“${f}\u audio.m4a”
ffmpeg-y-i“${fe}”-预设慢调胶片-vsync passthrough-writeútmcd 0-an-c:v libx264-x264opts'keyint=25:min keyint=25:no scenecut'-crf 22-maxrate 5000k-bufsize 12000k-pixúfmt yuv420p-f mp4“${f}5000.mp4”
ffmpeg-y-i“${fe}”-预设慢调胶片-vsync传递-写入tmcd 0-an-c:v libx264-x264opts'keyint=25:min keyint=25:no scenecut'-crf 23-maxrate 3000k-bufsize 6000k-pix_fmt yuv420p-f mp4“${f}3000.mp4”
ffmpeg-y-i“${fe}”-预设慢调胶片-vsync passthrough-writeútmcd 0-an-c:v libx264-x264opts'keyint=25:min keyint=25:no scenecut'-crf 23-maxrate 1500k-bufsize 3000k-pixúfmt yuv420p-f mp4“${f}1500.mp4”
ffmpeg-y-i“${fe}”-预设慢调胶片-vsync passthrough-write_tmcd 0-an-c:v libx264-x264opts'keyint=25:min keyint=25:no scenecut'-crf 23-maxrate 800k-bufsize 2000k-pix_fmt yuv420p-vf“scale=-2:720”-mp4“${f}800.mp4”
ffmpeg-y-i“${fe}”-预设慢调胶片-vsync passthrough-write_tmcd 0-an-c:v libx264-x264opts'keyint=25:min keyint=25:no scenecut'-crf 23-maxrate 400k-bufsize 1000k-pix_fmt yuv420p-vf“scale=-2:540”-f mp4“${f}400.mp4”
#ios和旧浏览器的静态文件
ffmpeg-y-i“${fe}”-预设慢调胶片-vsync passthrough-write_tmcd 0-c:aac-b:a 160k-c:v libx264-crf 23-maxrate 2000k-bufsize 4000k-pix_fmt yuv420p-f mp4“${f}/${f}.mp4”
rm-f ffmpeg*日志*
#如果音频流不存在,请忽略它
如果[-e“${f}_audio.m4a”];然后
MP4Box-dash strict 2000-rap-frag rap-bs开关否配置文件“dashavc264:live”“${f}5000.mp4”