首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用ffmpeg dash muxer创建多位速率的dash内容

如何使用ffmpeg dash muxer创建多位速率的dash内容
EN

Stack Overflow用户
提问于 2018-01-15 11:44:02
回答 3查看 18.5K关注 0票数 12

ffmpeg documentation说,我们可以使用dash多路复用器来创建dash段和清单文件,只需一条命令,例如:

代码语言:javascript
复制
ffmpeg -re -i <input> -map 0 -map 0 -c:a libfdk_aac -c:v libx264
-b:v:0 800k -b:v:1 300k -s:v:1 320x170 -profile:v:1 baseline
-profile:v:0 main -bf 1 -keyint_min 120 -g 120 -sc_threshold 0
-b_strategy 0 -ar:a:1 22050 -use_timeline 1 -use_template 1
-window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a"
-f dash /path/to/out.mpd

例如,我有一些高清视频文件,我希望这个视频可以通过DASH以不同的比特率提供,这样客户就可以根据当前的网络条件自动选择备选方案。像上面给出的那样,所有这些都可以用一个ffmpeg命令来完成吗?

我知道有一个使用ffmpeg + mp4box的解决方案,但我感兴趣的是,它是否可以只使用ffmpeg完成。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-27 06:36:58

好吧,这就是我如何解决我的问题的。以下命令对于实现伪实时dash内容很有用(当您想要流式传输现有视频文件时,就好像它是一个实时视频一样),但同样的方法也可以用于点播视频。首先,我们将一个输入视频文件(sample.divx)转换为另一个为dash流视频文件准备好的文件- sample_dash.mp4:

代码语言:javascript
复制
ffmpeg -y -i sample.divx ^
  -c:v libx264 -x264opts "keyint=24:min-keyint=24:no-scenecut" -r 24 ^
  -c:a aac -b:a 128k ^
  -bf 1 -b_strategy 0 -sc_threshold 0 -pix_fmt yuv420p ^
  -map 0:v:0 -map 0:a:0 -map 0:v:0 -map 0:a:0 -map 0:v:0 -map 0:a:0 ^
  -b:v:0 250k  -filter:v:0 "scale=-2:240" -profile:v:0 baseline ^
  -b:v:1 750k  -filter:v:1 "scale=-2:480" -profile:v:1 main ^
  -b:v:2 1500k -filter:v:2 "scale=-2:720" -profile:v:2 high ^
  sample_dash.mp4

我要说的是,sample_dash.mp4准备得很好,因为它是以一种适合dash的格式- H264/ACC编码的,并且它包含多(3)个不同质量的视频流(基线、主要、高)。ffmpeg dash muxer会将这3个视频流转换成相关的替代视频质量deash段文件。下面是如何实现的:

代码语言:javascript
复制
ffmpeg -y -re -i sample_dash.mp4 ^
  -map 0 ^
  -use_timeline 1 -use_template 1 -window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a" ^
  -f dash sample.mpd

-re标志告诉ffmpeg以实时方式处理输入视频,这对于伪直播流很有用。

票数 10
EN

Stack Overflow用户

发布于 2019-06-12 19:03:08

在此answerdocumentation的帮助下,以下是在单个命令中完成此操作的方法:

代码语言:javascript
复制
ffmpeg -i $inputFile \
  -map 0:v:0 -map 0:a\?:0 -map 0:v:0 -map 0:a\?:0 -map 0:v:0 -map 0:a\?:0 -map 0:v:0 -map 0:a\?:0 -map 0:v:0 -map 0:a\?:0 -map 0:v:0 -map 0:a\?:0  \
  -b:v:0 350k  -c:v:0 libx264 -filter:v:0 "scale=320:-1"  \
  -b:v:1 1000k -c:v:1 libx264 -filter:v:1 "scale=640:-1"  \
  -b:v:2 3000k -c:v:2 libx264 -filter:v:2 "scale=1280:-1" \
  -b:v:3 245k  -c:v:3 libvpx-vp9 -filter:v:3 "scale=320:-1"  \
  -b:v:4 700k  -c:v:4 libvpx-vp9 -filter:v:4 "scale=640:-1"  \
  -b:v:5 2100k -c:v:5 libvpx-vp9 -filter:v:5 "scale=1280:-1"  \
  -use_timeline 1 -use_template 1 -window_size 6 -adaptation_sets "id=0,streams=v  id=1,streams=a" \
  -hls_playlist true -f dash output/output.mpd
票数 7
EN

Stack Overflow用户

发布于 2020-08-26 17:53:56

问题是您认为过滤器应用在哪里。在ffmpeg逻辑中,视频过滤器应用于解码后的流和编码之前的流(无论您将它们放在命令行中的什么位置)。

因此,它们不能以您正在使用的方式使用。

在您的情况下,最好的方法可能是使用滤波器复合体,它在解码后立即将视频分割为4个不同的中间视频,然后对每个视频应用不同的缩放,然后获取它们的输出并对其进行编码。

类似这样的东西(为了简短起见,我将简化为两个不同的变体,我相信你可以重新适应6):

代码语言:javascript
复制
ffmpeg -i $inputFile -filter_complex "[0]split=6[mid0][mid1];[mid0]scale=320:-1[out0];[mid1]scale=640:-1[out1]" -map [out0] -map 0:a -map [out1] -map 0:a -c:a aac -c:v:0 libx264 -c:v:1 libvpx-vp9 -use_timeline 1 -use_template 1 -window_size 6 -adaptation_sets "id=0,streams=v  id=1,streams=a" -hls_playlist true -f dash output/output.mpd

这只是一个例子,希望它能带你走上正轨:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48256686

复制
相关文章

相似问题

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