如何在 iOS 应用程序中将传输流转换(重新包装)为 MPEG-4 容器?
Posted
技术标签:
【中文标题】如何在 iOS 应用程序中将传输流转换(重新包装)为 MPEG-4 容器?【英文标题】:How to convert (re-wrap) Transport Stream to MPEG-4 container in iOS app? 【发布时间】:2013-07-28 06:46:34 【问题描述】:我有一个 .ts 格式的直播,包含 AAC 音频和 H.264 视频。我想在 ios 设备上播放它。我尝试使用a movie player based on FFmpeg 解码和播放视频,但音频滞后。
我可以将此传输流重新包装到 MPEG-4 容器中以在 iOS 设备上播放 - 无需将其转换到服务器端吗?
服务器向我返回 .ts 直播流的 URL,我的目标是在没有 .m3u8 播放列表的 iOS 设备上播放此流,因为我无法从服务器获取它。
【问题讨论】:
感谢您的回复,我已经编辑了帖子。如果您对我的问题有任何建议,请写下来。 感谢您的澄清,但仍然有点不清楚您在做什么——您是否已经有一个应用程序或一些 iOS 代码来获取 TS?您是否尝试过使用 FFmpeg 库?由于这是一个编程问答网站,因此通常要求问题包含一些代码和您遇到的特定问题。 我已经构建了 FFmpeg,并使用了我插入 TS 链接的示例应用程序。我还尝试在服务器上创建文件,在 m3u8 播放列表中包含指向 TS 的链接,如下所示:#EXTM3U #EXTINF:-1, URL #EXT-X-ENDLIST 然后使用 MPMoviePlayer 播放创建的文件,但只播放音频和 QuickTime展示了徽标。 您能否添加更多有关您在 IOS 应用程序上可用的 ffmpeg 的详细信息?你能用 CLI 工具吗,如果不能用怎么用? 【参考方案1】:要在不转码的情况下重新复用,您可以使用:ffmpeg -i input.ts -acodec copy -vcodec copy out.mp4
【讨论】:
... 作为 CLI 工具,还是只是与 API 一起使用的静态库?我不知道。 据我了解,我使用静态库构建了应用程序,如 movie player for iOS using ffmpeg 所说,我还将 FFmpeg 构建为 CLI 工具,我可以从 CLI 转换视频,但我想在 iOS 应用程序中播放实时流。我怎样才能做到这一点?是唯一一种在服务器上转换直播流的解决方案吗? 和-c copy
一样吗?【参考方案2】:
我使用了ffmpeg -i input.ts -acodec copy -vcodec copy out.mp4
,但转换失败。
然后我使用-bsf:a aac_adtstoasc
标志和转换通过,出现“非单调 DTS”错误,导致输出文件中的时间戳不正确。
out.mp4 文件播放得很好,但是当我从中提取音频时,音频的长度与视频的长度不同。
如果我使用提取的音频替换原始文件中的音频,则生成的视频文件中的音频不同步(音频滞后)。
然后我将 out.mp4 剪辑导入 DaVinci Resolve 视频编辑器。音频和视频文件的长度显示相同,因此我仅导出音频并获得与原始视频相同的文件大小。
但是,当我在 Audacity 中播放文件并查看音频图表时,我注意到许多空白区域(没有声音)。使用 Audacity、ffmpeg、VLC、VSDC Video Editor 创建的音频文件都提供了与原始视频文件不同大小的音频文件,尽管它们都有声音。
我听说 projectX to demux a/v 作为一种可能的解决方案。 Demux 成功完成,但创建了一个 1KB 的 mp1 文件,有很多错误:“PTS without a frame”。
eac3to 成功从 TS 视频文件中提取 AAC 音频。两个文件大小相同。使用 ffmpeg 替换视频文件中的音频会产生完美的同步,没有滞后或空白的声音。 没有关于“非单调 DTS”或不正确时间戳的错误。
完成。
【讨论】:
更多细节在这里 - askubuntu.com/questions/716424/…以上是关于如何在 iOS 应用程序中将传输流转换(重新包装)为 MPEG-4 容器?的主要内容,如果未能解决你的问题,请参考以下文章
java 节点流(字符流,字节流)和包装流(缓冲流,转换流)
将 h.264 流包装在 mp.4 容器中并使用 nodejs 流式传输
如何在 iOS 中将 2 个单声道文件转换为一个立体声文件?
如何将TS源流重新封装并通过P2P协议传输在安卓终端和苹果终端播放