我目前正在尝试创建流媒体内容以供测试,并且必须创建 CMAF 内容。我有此代码,但我真的不知道这是否是在创建真正的 CMAF 内容:
IN_VIDEO="$1"
FILENAME=$(echo "$IN_VIDEO" | cut -f 1 -d '.')
DIR=./$FILENAME
if [ -z "$IN_VIDEO" ];then
echo "Must input a file"
$SHELL
exit
fi
FILENAME=$(echo "$IN_VIDEO" | cut -f 1 -d '.')
DIR=//opt/lampp/htdocs/streamingtest/$FILENAME
OUTDIR=//opt/lampp/htdocs/streamingtest/$FILENAME/CMAF
mkdir -p -v $DIR
mkdir -p -v $OUTDIR
# Assuming that input video is 1080p
ffmpeg -i $IN_VIDEO -vn -acodec copy $DIR/$FILENAME-AUD.mp4 \
-i $IN_VIDEO -vf scale=1920:1080,setsar=1 -an $DIR/$FILENAME-1080.mp4 \
-i $IN_VIDEO -vf scale=1280:720,setsar=1 -an $DIR/$FILENAME-720.mp4 \
-i $IN_VIDEO -vf scale=854:480,setsar=1 -an $DIR/$FILENAME-480.mp4 \
-i $IN_VIDEO -vf scale=640:360,setsar=1 -an $DIR/$FILENAME-360.mp4 \
-i $IN_VIDEO -vf scale=426:240,setsar=1 -an $DIR/$FILENAME-240.mp4 \
rm -R $OUTDIR
packager \
input=$DIR/$FILENAME-AUD.mp4,stream=audio,init_segment=$OUTDIR/aud_init.mp4,segment_template=$OUTDIR/aud_\$Number\$.mp4,playlist_name=audio.m3u8,hls_group_id=audio \
input=$DIR/$FILENAME-1080.mp4,stream=video,init_segment=$OUTDIR/vid_init-1080.mp4,segment_template=$OUTDIR/vid-1080_\$Number\$.mp4,playlist_name=video-1080.m3u8 \
input=$DIR/$FILENAME-720.mp4,stream=video,init_segment=$OUTDIR/vid_init-720.mp4,segment_template=$OUTDIR/vid-720_\$Number\$.mp4,playlist_name=video-720.m3u8 \
input=$DIR/$FILENAME-480.mp4,stream=video,init_segment=$OUTDIR/vid_init-480.mp4,segment_template=$OUTDIR/vid-480_\$Number\$.mp4,playlist_name=video-480.m3u8 \
input=$DIR/$FILENAME-360.mp4,stream=video,init_segment=$OUTDIR/vid_init-360.mp4,segment_template=$OUTDIR/vid-360_\$Number\$.mp4,playlist_name=video-360.m3u8 \
input=$DIR/$FILENAME-240.mp4,stream=video,init_segment=$OUTDIR/vid_init-240.mp4,segment_template=$OUTDIR/vid-240_\$Number\$.mp4,playlist_name=video-240.m3u8 \
--hls_master_playlist_output $OUTDIR/master.m3u8 \
--generate_static_mpd \
--mpd_output $OUTDIR/manifest.mpd
这仅从一组 mp4 视频生成 DASH 清单和 HLS 主播放列表。这是否符合 CMAF 标准,还是我理解错了?
谢谢!
答案1
一些观察:
您应该确保不同的表示在相同的位置具有关键帧,并且 GOP 大小有些规则。现在情况并非如此。请参阅这个问题了解更多信息。
确保各个片段的长度限制为最多 8-10 秒,并且片段长度不超过 2 秒。
您未指定任何比特率限制或质量设置。您的比特率在表示内和表示之间会有很大差异。使用两遍编码或上限 CRF 编码来限制每个流的比特率变化。
您没有设置任何 H.264 配置文件或级别,或强制使用特定的帧速率、像素格式或位深度。如果您的输入不符合正确的规格,您最终可能会制作出具有并非所有播放器都支持的功能的视频(例如,4:4:4 子采样、过高的帧速率、10 位内容等)
您只是复制音频,而不强制使用特定的编解码器或比特率。与上述评论相同。
除此之外,使用碎片化的 MP4 片段进行 HLS 是 CMAF 规范的一部分,所以应该没问题。
我不知道有任何工具可以为您提供合规性检查。但如果您不想根据官方 ISO 规范手动验证,您可以找到Apple 开发者文档并附有示例播放列表以供比较。