Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 具有不同长度音频文件的HTTP实时流媒体_Ios_Safari_Http Live Streaming - Fatal编程技术网

Ios 具有不同长度音频文件的HTTP实时流媒体

Ios 具有不同长度音频文件的HTTP实时流媒体,ios,safari,http-live-streaming,Ios,Safari,Http Live Streaming,我正在尝试使用苹果的协议将音频流传输到iOS和Safari客户端。与HTTP实时流媒体的许多常见实现不同,我的目标是使用短音频片段,这些短音频片段本质上具有不同的长度,主要在10-30秒的范围内。除了从这些片段流式传输音频外,我还希望访问每个片段的元数据,以便更新显示和/或为用户提供其他选项,以获取有关特定音频片段的更多信息 目前,我已经设置了一些测试用例,将源音频(MP3)转换为各种格式,并创建流式M3U文件,以便在iOS设备上进行测试,但我的方法都没有正常工作(正确流式传输并将元数据传递给客

我正在尝试使用苹果的协议将音频流传输到iOS和Safari客户端。与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:使用苹果的mediafilesegmenter创建单个MP3文件

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

mediafilesegmenter -t 999 -f "$OUTPUT_DIR" "$INPUT_FILE" && cp $OUTPUT_DIR/fileSequence0.mp3 $OUTPUT_FILE
生成的MP3文件似乎有一些时间戳数据,因为vbindiff显示了文件头中的更改,并且字符串“com.apple.streaming.transportStreamTimestamp”显示在新文件的前几个字节中。研究这根弦会在下面的句子中找到一段话:

基本音频流文件必须 用信号表示第一个事件的时间戳 通过在 具有所有者的ID3 PRIV tag[ID3] 标识符 “com.apple.streaming.transportStreamTimestamp”。 二进制数据必须是33位 MPEG-2程序基本流 表示为大端的时间戳 八个八位组的数字,上半部分为31 位设置为零

然后我创建了一个M3U文件,就像方法1一样。(请注意,使用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,但没有成功。

只是一个建议。。你试过这个项目吗?我正在我的项目中使用它,它很好

更新1-

您可以使用FFMPEG的参数-“-map\u meta\u 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;

除非片段作为单个流准备,否则解码器不一定能够在它们之间无缝切换


当解码器需要重置时,应该引入一行。除非您正在分割一个较长的mp3文件,否则您需要在每一个新mp3之前标记中断。

谢谢您的建议。我看过AudioStreamer,但我认为它不适合这个项目,因为我正在播放由许多不同长度的片段组成的相当长的音频流。AudioStreamer不支持HTTP实时流媒体。关于您关于ffmpeg的说明,我在将元数据输入或输出MP3文件方面没有问题;我的问题是,当添加到HTTP直播播放列表时,生成的MP3文件无法正常播放。我只能可靠地播放MPEG TS(传输流)文件,但这些文件没有元数据。是的,我的一个项目遇到了相同的问题,我在该项目中使用了AutioStreamer。您好pix hw r u?我也做同样的音频流,但我真的没有找到任何合适的文件或源代码。请帮助我摆脱这个问题当使用ffmpeg解决方案并将元数据传递到该流时,生成的TS文件是否实际包含文本元数据?如果是这样的话,具体使用哪种格式?不,它们似乎不包含任何元数据。使用id3工具、
exiftool
file
、或苹果的AVPlayer客户端,我至少找不到一个可以提取出来的。我不确定TS文件如何以及是否真正包含元数据。我看到的TS规范在这个问题上似乎含糊不清。你能把你的TS结果放在网上吗?这样我就可以仔细看看了?目前我正在做很多关于TS/MPMoviePlayerController的研究,因此它适合我的工作,也许你也能从中受益。