首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >只有一个mp4文件的MPEG-DASH视频流

只有一个mp4文件的MPEG-DASH视频流
EN

Stack Overflow用户
提问于 2016-02-06 16:38:35
回答 4查看 21.2K关注 0票数 3

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

在浏览器incompatibility的情况下,支持

  • 单个mp4文件(未分段和多路复用(Audio+Video))
  • HTTP字节范围服务supported
  • progressive流(直接文件下载)

通过对苹果HLS、Adobe Flash Stream、微软平滑、RTSP和MPEG-DASH的研究,MPEG-DASH是比较合适的解决方案。但问题是MPEG-DASH迫使我将mp4文件拆分成单独的分段文件,这导致复制消耗空间来存储mp4文件,因为我必须在浏览器不兼容的情况下支持渐进流。因此,将单个mp4文件与分段的mp4文件存储在一起是不可避免的。

问题是:有没有办法在任何浏览器中以http流和渐进流的形式提供单个 mp4文件?

MPEG-DASH协议说它支持多路复用文件,但问题是dash.js不支持它。有没有其他的javascript播放器支持多路复用和单个mp4文件的字节范围请求?

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

参考资料:BitCodin.com 1 BitCodin.com 2

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-02-11 21:17:13

我认为所有主流浏览器都支持mp4。http://caniuse.com/#feat=mpeg4。你可以使用一个很好的旧的http服务器来传输它。只有当你需要像自适应比特率流,多语言,数字版权管理等花哨的东西时,才需要MPEG-DASH

如果您坚持使用MPEG-DASH,那么只需在服务器端使用mp4box对mp4文件进行分段(只需执行一次)。结果不是多个mp4文件,而是以更适合流式传输的方式组织的单个mp4文件。

票数 7
EN

Stack Overflow用户

发布于 2016-02-08 03:18:22

是的,有一个解决方案。dash.js仅播放已打包的零碎mp4s。然而,来自电信Paristech的Cyril的这个项目将完成您想要的:

https://github.com/gpac/mp4box.js/

这是mp4box的js版本。它所能做的就是将你的非碎片化的mp4即时转换成媒体片段,然后这些媒体片段可以被提供给一个MSE sourceBuffer。他们有一个样例播放器,你可以复制它:

http://download.tsi.telecom-paristech.fr/gpac/mp4box.js/

干杯将会

票数 6
EN

Stack Overflow用户

发布于 2019-03-13 08:12:14

也许这会对你有所帮助:

代码语言:javascript
复制
#!/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"
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35239044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档