Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.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
Objective c 如何从AVPlayer中的mpd文件中提取字幕?_Objective C_Avplayer_Subtitle_Mpd - Fatal编程技术网

Objective c 如何从AVPlayer中的mpd文件中提取字幕?

Objective c 如何从AVPlayer中的mpd文件中提取字幕?,objective-c,avplayer,subtitle,mpd,Objective C,Avplayer,Subtitle,Mpd,我想在AVPlayer中显示字幕。字幕嵌入在mpd文件中。我需要从下面的xml中获取字幕,并将其保存在文档目录中的某个位置 我正在这里下载文件: - (void)getSubTitle { NSURLSession *session = [NSURLSession sharedSession]; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[self.dictResponse

我想在AVPlayer中显示字幕。字幕嵌入在mpd文件中。我需要从下面的xml中获取字幕,并将其保存在文档目录中的某个位置

我正在这里下载文件:

- (void)getSubTitle {
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[self.dictResponse objectForKey:@"mpd_url"]]];
    NSURLSessionDownloadTask *taskD = [session downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    if (error == nil) {
        NSData *data = [NSData dataWithContentsOfURL:location];
        NSString *context = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"Subtitle: %@",context);
    }else{
        NSLog(@"Subtitle: %@",error.localizedDescription);
    }
}];
    [taskD resume];
}
从服务器获取以下代码段作为响应:

<?xml version="1.0" ?>
<MPD mediaPresentationDuration="PT2M30.550S" minBufferTime="PT8.34S" profiles="urn:mpeg:dash:profile:isoff-live:2011" type="static" xmlns="urn:mpeg:dash:schema:mpd:2011">
  <!-- Created with Bento4 mp4-dash.py, VERSION=1.7.0-614 -->
  <Period>
    <!-- Video -->
    <AdaptationSet maxHeight="720" maxWidth="1280" mimeType="video/mp4" minHeight="720" minWidth="1280" segmentAlignment="true" startWithSAP="1">
      <SegmentTemplate initialization="$RepresentationID$/init.mp4" media="$RepresentationID$/seg-$Number$.m4s" startNumber="1" timescale="30000">
        <SegmentTimeline>
          <S d="250250" r="17"/>
          <S d="12012"/>
        </SegmentTimeline>
      </SegmentTemplate>
      <Representation bandwidth="2138017" codecs="avc1.42C01F" frameRate="30000/1001" height="720" id="video/avc1" scanType="progressive" width="1280"/>
    </AdaptationSet>
    <!-- Audio -->
    <AdaptationSet mimeType="audio/mp4" segmentAlignment="true" startWithSAP="1">
      <SegmentTemplate initialization="$RepresentationID$/init.mp4" media="$RepresentationID$/seg-$Number$.m4s" startNumber="1" timescale="48000">
        <SegmentTimeline>
          <S d="400384" r="17"/>
          <S d="19328"/>
        </SegmentTimeline>
      </SegmentTemplate>
      <Representation audioSamplingRate="48000" bandwidth="143079" codecs="mp4a.40.2" id="audio/und/mp4a">
        <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
      </Representation>
    </AdaptationSet>
    <!-- Subtitles (Sidecar) -->
    <AdaptationSet contentType="text" lang="en" mimeType="text/vtt">
      <Role schemeIdUri="urn:mpeg:dash:role:2011" value="subtitle"/>
      <Representation bandwidth="130" id="subtitles/en">
        <BaseURL>subtitles/en/en_vtt.txt</BaseURL>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

副标题/en/en_vtt.txt

无法从此处提取字幕。

请解析XML以检索
period.adaptionsets.last.representation.baseURL
,然后在此URL处下载文件。感谢您的回复。我使用AVAsset获得了另一个解决方案。好的,很好,那么请将您的解决方案作为自己的答案发布。:)谢谢,但请使用屏幕底部的蓝色“回答您的问题”按钮。
I can get the subtitles using this:

AVAsset *avAsset = [mAVPlayer.currentItem asset]; 
NSArray *requestKeys = [NSArray arrayWithObjects:@"tracks",@"playable",nil]; 
[avAsset loadValuesAsynchronouslyForKeys:requestKeys completionHandler:^{ 
AVKeyValueStatus status =[avAsset statusOfValueForKey:@"tracks" error:nil]; 
if(status == AVKeyValueStatusLoaded) { 
AVMediaSelectionGroup *subtitle = [avAsset mediaSelectionGroupForMediaCharacteristic: AVMediaCharacteristicLegible]; 
} 
}];