菜鸟教程小白 发表于 2022-12-12 22:30:34

ios - AVPlayer Live stream如何为音频电平计量获取电源


                                            <p><p>我试图在我的应用程序中显示一个仪表图,它使用 AVPlayer 来流式传输实时音频流。</p>

<p>我知道 AVAudioPlayer 有一种方法:
<a href="https://stackoverflow.com/questions/10504428/trying-to-understand-avaudioplayer-and-audio-level-metering" rel="noreferrer noopener nofollow">Trying to understand AVAudioPlayer and audio level metering</a> </p>

<p>它使用 <code>peakPowerForChannel</code></p>

<p>但 AVAudioPlayer 不适用于音频流。</p>

<p>AVPlayer 有类似的东西吗?或者有没有其他方法可以从 AVPlayer 获取功率值?</p>

<p>代码:</p>

<pre><code>[ setCategory:AVAudioSessionCategoryPlayback error:nil];
    if (self.avplayer) {
      ;
    }
    AVURLAsset *avAsset = [ initWithURL: options:nil];
    NSArray *keys = @[@&#34;playable&#34;];
    [avAsset loadValuesAsynchronouslyForKeys:keys completionHandler:^{
      dispatch_async(dispatch_get_main_queue(), ^{
            AVPlayerItem *newItem = [ initWithAsset:avAsset];
            if (!self.avplayer) {
                self.avplayer = [ initWithPlayerItem:newItem];
            } else {
                ;
            }
            ;
            ;
      });
    }];

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                        change:(NSDictionary *)change context:(void *)context {
    NSLog(@&#34;%@ called&#34;,keyPath);
    if ( ) {
      ;
    } else if ( ) {
      if (self.avplayer.rate) {
            NSLog(@&#34;Playing...&#34;);
            [ postNotificationName:@&#34;currentPlayingChangedToPlay&#34; object:nil];

      } else {
            NSLog(@&#34;Not playing...&#34;);
            [ postNotificationName:@&#34;currentPlayingChangedToPause&#34; object:nil];
      }
    }

}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>通常,您可以通过在播放器项目上使用 <code>MTAudioProcessingTap</code> 来获取 <code>AVPlayer</code> 的音频样本,但是您的 Assets 通过 </p>

<ol>
<li><code>AVURLAsset</code> 上的 <code>tracks</code> 属性永远不可用</li>
<li>当您观察并将水龙头附加到您的 <code>playerItem.tracks</code> 的 <code>assetTrack</code> 时,不会给您回电话。</li>
</ol>

<p>我从来没有看到一个很好的解释为什么这对远程 <code>mp3</code> 或 <code>m3u8</code> 流不起作用,而且恼人的是,它确实对其他远程 Assets 有效类型,例如 <code>aac</code>。不公平的是,在视频方面,<a href="https://stackoverflow.com/a/39553034/22147" rel="noreferrer noopener nofollow">AVPlayerItemVideoOutput</a>似乎适用于所有类型的 Assets (除非 DRM 问题)!</p>

<p>那么这会给您带来什么影响呢?一种方法是自己从可以使用 <code>AudioQueue</code> 解码和播放的位置流式传输 mp3 数据,并且<em>还</em>使用上述<code>MTAudioProcessingTap</计算峰值功率</code>。涉及 <code>AudioConverter</code>/<code>AudioUnit</code> 和 <code>AVAudioConverter</code>/<code>AVAudioEngine</code> 的解决方案也浮现在脑海中。</p>

<p>如果仅替换单个属性听起来工作量太大,您可以查看预制解决方案,例如 <a href="https://github.com/tumtumtum/StreamingKit/" rel="noreferrer noopener nofollow">StreamingKit</a>或 <a href="https://github.com/muhku/FreeStreamer" rel="noreferrer noopener nofollow">FreeStreamer</a>然后计算功率。您可能会找到一个为您计算功率的图书馆。如果不是,您可以使用 <a href="https://stackoverflow.com/a/7845967/22147" rel="noreferrer noopener nofollow">this formula</a> 计算 <code>peakPowerForChannel</code> </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - AVPlayer Live stream如何为音频电平计量获取电源,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/39947408/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/39947408/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - AVPlayer Live stream如何为音频电平计量获取电源