当前位置: 首页 > 知识库问答 >
问题:

基于ffmpeg的实时转码和HLS流

姬弘文
2023-03-14

我正在构建一个web应用程序,涉及服务各种视频内容。Web友好的音频和视频编解码器处理没有任何问题,但我在设计与HTML5视频播放器如mkv容器或H265不兼容的视频文件交付时遇到了麻烦。

ffmpeg -i sample.mkv \
       -c:v libx264 \
       -crf 18 \
       -preset ultrafast \
       -maxrate 4000k \
       -bufsize 8000k \
       -vf "scale=1280:-1,format=yuv420p" \
       -c:a copy -start_number 0 \
       -hls_time 10 \
       -hls_list_size 0 \
       -f hls \
file.m3u8
ffmpeg -ss 90 \
       -t 10 \
       -i sample.mkv \
       -g 52 \
       -strict experimental \
       -movflags +frag_keyframe+separate_moof+omit_tfhd_offset+empty_moov \
       -c:v libx264 \
       -crf 18 \
       -preset ultrafast \
       -maxrate 4000k \
       -bufsize 8000k \
       -vf "scale=1280:-1,format=yuv420p" \
       -c:a copy \
fileSequence0.mp4
#EXTM3U
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
fileSequence0.mp4
#EXTINF:10.0,
fileSequence1.mp4
...
... and so on 
...
#EXT-X-ENDLIST

我的技术可行吗?因为只有在关键帧之后才可能进行分段,所以预置分段持续时间会有什么问题吗?ffmpeg是否可以绕过这个问题?

我对视频处理和生成的知识充其量只是微不足道。我将非常感谢一些指点。

共有1个答案

柴霖
2023-03-14

这是可能的,但很难。我甚至认为,使用FFMPEG可能是不可能的。传输流具有时间戳和连续性计数器,这些值应跨段边界保留。-copyts标志可能对此有所帮助。在这种情况下,B帧非常难处理,因为它们最终会在段外带有时间戳。音频也很难。当编码器初始化时,音频有启动样本,这意味着你可能会有额外的样本,每个片段通过音频弹出。

TLDR是可能的,但您需要了解容器和底层编解码器的结构,并使用它们。

 类似资料:
  • 我正尝试在iOS应用程序中使用ffmpeg将本地。mp4视频转换为HLS。我已经使用pods集成了ffmpeg包装器,并生成了所有分段的。ts文件和m3u8文件,但是一些。ts文件段没有在。m3u8播放列表文件中列出,如下所示。它总是列出最后5个视频片段。 我使用以下代码生成HLS。 还有其他方法可以做到这一点吗?

  • 我试图转换一个实时的rtmp流到hls流。 我看了之后有了一些想法 提前谢谢...

  • 我想把一个HLS流和转码到RTMP,并与nginx RTMP模块联播。 但是它不起作用(我把它放在RTMP模块的应用程序部分)。 当我试图在VLC中查看我的RTMP流时,它没有加载。我已经尝试了ffmpeg指令的几个变体,没有一个奏效。有什么建议吗?如果您需要查看更多我的配置文件,我可以提供,但这台服务器在以前通过Teradek编码器发送视频时一直工作得很好。这条新皱纹不起作用了。 编辑:只是有个

  • 我正在尝试使用ffmpeg(在OSX上运行)将基本mp4视频转换为HLS视频,使用以下命令: 它确实生成了所有段文件,但是生成的播放列表文件只列出了最后四个段文件,删除了所有早期的段。帮忙?

  • 在这一点上,我的解决方案是工作的,但只能作为RTMP,我可以使用URL完美地观看我的流: 但问题是我的LG智能电视使用WebOS不支持RTMP,我真的很想在那里播放我的流。我现在能看到的唯一解决方案是使用HLS。使用HLS也很好,但我需要在打开电视中的HLS流之前执行我的ffmpeg命令,否则它将不会创建在电视上显示流所需的文件。