我有一组(相当大)的文件,它们都是H264在一个码流容器。由于时间限制,我需要将这些内容重新打包成流畅的流媒体,而无需对其进行转码(转码会花费太长时间)。
我一直在尝试弄清楚如何使用 ffmpeg 来实现这一点,因为它似乎有 2 个不同的复用器可以完成这项任务。我尝试了“smoothstreaming”复用器和“ismv”复用器,但使用它们时我都遇到了问题。
ffmpeg -i input.mpg -codec copy -f smoothstreaming ss_out
这样,我收到以下错误:
ffmpeg 版本 N-79695-g675cfb2 版权所有 (c) 2000-2016 FFmpeg 开发人员 使用 gcc 5.3.1 (Debian 5.3.1-14) 构建 20160409 配置: libavutil 55. 23.100 / 55. 23.100 libavcodec 57. 38.100 / 57. 38.100 libavformat 57. 35.100 / 57. 35.100 libavdevice 57. 0.101 / 57. 0.101 libavfilter 6. 44.100 / 6. 44.100 libswscale 4. 1.100 / 4. 1.100 libswresample 2. 0.101 / 2. 0.101 输入 #0,mpegts,来自‘input.mpg’: 时长:01:28:41.98,开始:2.040000,比特率:2500 kb/s 计划 1 流 #0:0[0x1e1]: 视频:h264 (主) ([27][0][0][0] / 0x001B),yuv420p,720x576 [SAR 16:11 DAR 20:11],25 fps,25 tbr,90k tbn 流 #0:1[0x1e2](eng): 音频:mp2 ([4][0][0][0] / 0x0004),48000 Hz,立体声,s16p,192 kb/s [smoothstreaming @ 0x2616340] 使用 AVStream.codec 将编解码器参数传递给多路复用器已被弃用,请改用 AVStream.codecpar。 最后一条消息重复了 1 次 [smoothstreaming @ 0x2616340] 未为流 0 设置比特率 输出 #0,平滑流,至‘ss_out’: 元数据: 编码器:Lavf57.35.100 流 #0:0:视频:h264 ([33][0][0][0] / 0x0021),yuv420p,720x576 [SAR 16:11 DAR 20:11],q=2-31,25 fps,25 tbr,50 tbn 流 #0:1(eng):音频:mp2 (i[0][0][0] / 0x0069),48000 Hz,立体声,192 kb/s 流映射: 流 #0:0 -> #0:0 (复制) 流 #0:1 -> #0:1 (复制) 无法为输出文件 #0 写入标题(编解码器参数不正确?):参数无效
我尝试的另一件事是使用 ffmpeg 将其打包成 ismv:
ffmpeg -i input.mpg -c copy -movflags isml+frag_keyframe -f ismv ss_out.ismv
到目前为止,一切都正常,但是我需要 ismindex 工具来创建清单文件,但却失败了:
ismindex -n ss_out ss_out.ismv
Unable to read the MFRA atom in ss_out.ismv (mfra size mismatch)
是我做错了什么,还是我的输入文件有问题?
答案1
因此,我认为我的问题有两个可能的解决方案,两个都可以实现,但是最终结果却不同。
ISMV 多路复用器 + ismindex
我需要的是一组服务器端文件(.ism、.ismc、.ismv)。为了实现这一点,我最终做了以下两件事:
ffmpeg -i input.mpg -c:v copy -c:a aac -b:a 192k -movflags frag_keyframe -f ismv ss_out.ismv
上述命令复制视频流而不对其进行转码,将音频转码为 AAC(尽管 ffmpeg 和 ismindex 似乎都不介意 MP2 音频)并将其打包为 .ismv。
ismindex -n ss_out ss_out.ismv
然后 ismindex 工具可以创建我需要的 .ism 和 .ismc 文件。
我从中获取的文件可以通过带有媒体服务的 IIS 进行流式传输。
平滑流复用器
最后,我还让“smoothstreaming”复用器开始工作,诀窍在于它也需要一个 .ismv 文件作为输入。因此,我首先运行与上述相同的 ffmpeg 命令,然后可以再次使用 ffmpeg 将其与“smoothstreaming”复用器重新打包。
不过,我对此解决方案的问题是,它会导致传统网络服务器需要一些文件才能流畅地进行流式传输。因此,它将视频片段拆分,并将元数据按块进行分配。这些通常都由流式传输服务器处理。