gpt4 book ai didi

ios - 具有不同长度的音频文件的 HTTP 实时流式传输

转载 作者:可可西里 更新时间:2023-11-01 03:00:06 24 4
gpt4 key购买 nike

我正在尝试使用 Apple 的 HTTP Live Streaming 将音频流式传输到 iOS 和 Safari 客户端协议(protocol)。与 HTTP 实时流媒体的许多常见实现不同,我的目标是使用本质上具有不同长度的短音频剪辑,主要在 10-30 秒范围内。除了从这些片段中流式传输音频外,我还想访问每个片段的元数据,以便我可以更新显示和/或为用户提供额外的选项以获取有关特定音频片段的更多信息。

目前我已经设置了一些测试用例,将我的源音频 (MP3) 转换为各种格式并创建流式 M3U 文件以在 iOS 设备上进行测试,但我的方法都没有正常工作(正确流式传输并将元数据传递给客户端)。我正在使用 AVPlayer 加载和播放创建的 M3U 文件:

_playerItem = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"http://localhost/sample.m3u8"]]
_player = [[AVPlayer alloc] initWithPlayerItem:_playerItem];
[_playerItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:NULL];

// ... wait for user input

[_player play];

方法 1:原始 MP3 文件

我将带有 id3v2 (v2.3.0) 元数据的原始源 MP3 文件添加到 M3U 播放列表中。

#EXTM3U
#EXT-X-TARGETDURATION:23
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:14
http://localhost/trk_01.mp3
#EXTINF:22
http://localhost/trk_02.mp3
#EXTINF:16
http://localhost/trk_03.mp3
#EXT-X-ENDLIST

结果:timedMetadata 属性会在第一首轨道的正确 ID3 信息开始播放后立即更新。第一首轨道播放,但在接近尾声时中断。第二首轨道的 ID3 数据出现,但第二首轨道没有开始播放。片刻之后,我在控制台收到一条错误消息:

2011-04-26 07:04:52.668 TestClient[49756:601b] Prime: Exiting because mConverterError is '!buf' (0x800 req, 0x0 primed)
2011-04-26 07:04:52.668 TestClient[49756:601b] Prime failed ('!buf'); will stop (2048/0 frames)

方法 2:使用 Apple 的 mediafilesegmenter 来创建单独的 MP3 文件

在这种方法中,我使用 mediafilesegmenter 为每个片段创建一个新的 MP3 文件。 Apple 的分段工具通常用于分段,但是因为我的音频剪辑都很短且长度不一,所以这不太适合我的应用程序。我将 999 秒的目标持续时间传递给该实用程序,以便它为我提供的每个输入文件创建一个输出文件。这是我用来创建每个单独轨道的命令:

mediafilesegmenter -t 999 -f "$OUTPUT_DIR" "$INPUT_FILE" && cp $OUTPUT_DIR/fileSequence0.mp3 $OUTPUT_FILE

生成的 MP3 文件似乎有一些时间戳数据,因为 vbindiff 向我显示了文件头的变化,并且字符串“com.apple.streaming.transportStreamTimestamp”出现在新文件的前几个字节中。研究该字符串会在 HTTP Live Streaming draft specification 中出现一段话:

Elementary Audio Stream files MUSTsignal the timestamp of the firstsample in the file by prepending anID3 PRIV tag [ID3] with an owneridentifier of"com.apple.streaming.transportStreamTimestamp".The binary data MUST be a 33-bitMPEG-2 Program Elementary Streamtimestamp expressed as a big-endianeight-octet number, with the upper 31bits set to zero.

然后我像方法 1 一样创建一个 M3U 文件。(请注意,使用 mediafilesegmenter 我还可以使用预先创建的 ID3 标记文件和描述 ID3 时间偏移的元文件传递 ID3 信息。我在这里跳过它是因为我什至无法正确播放这些文件。)

结果:第一首轨道与方法 1 一样播放。轨道在接近尾声时再次中断,第二首轨道不播放。不存在元数据,但可以使用 mediafilesegmenter 的 -M 选项轻松添加。

方法 3:使用 ffmpeg 创建 MPEG 传输流文件

使用最后一种方法,我通过 ffmpeg 传递我的源 MP3 文件以创建 MPEG 传输流数据:

ffmpeg -i "$INPUT_FILE" -f mpegts -acodec copy "$OUTPUT_FILE"

然后我像前两种方法一样创建一个 M3U。

结果:这种方法确实有效;所有文件在客户端上流畅传输。但是,我无法将任何元数据传递给客户端。我试过将 -metadata title="My Title" 之类的参数传递给 ffmpeg,但没有成功。

最佳答案

只是一个建议..你试过这个项目吗 - https://github.com/DigitalDJ/AudioStreamer我在我的项目中使用它并且它很好

更新 1 -

您可以使用 FFMPEG 的参数 - “-map_meta_data”将元数据信息从一个文件传输到另一个文件

这是一个例子-

ffmpeg -i /root/Desktop/new_tracks/02-drug-raps.mp3 -ab 24k /root/Desktop/new_tracks/converted/2.mp3 -map_meta_data /root/Desktop/new_tracks/02-drug-raps.mp3:/root/Desktop/new_tracks/converted/2.mp3;

关于ios - 具有不同长度的音频文件的 HTTP 实时流式传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5791839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com