webrtc 讀寫文件操作1------- 本地播放文件

1、接口函數如下:兩個函數的區別主要是一個是傳入函數名,一個是傳入數據流。

loop 表示要不要循環播放,format 表示採用的。

  int StartPlayingFileLocally(int channel,
                              const char fileNameUTF8[1024],
                              bool loop = false,
                              FileFormats format = kFileFormatPcm16kHzFile,
                              float volumeScaling = 1.0,
                              int startPointMs = 0,
                              int stopPointMs = 0) override;

  int StartPlayingFileLocally(int channel,
                              InStream* stream,
                              FileFormats format = kFileFormatPcm16kHzFile,
                              float volumeScaling = 1.0,
                              int startPointMs = 0,
                              int stopPointMs = 0) override;

2、channel 創建FilePlayer,並增加混音 additionalParticipant 角色,最終通過和遠端通道一起混音播放。

int Channel::StartPlayingFileLocally(const char* fileName,
                                     bool loop,
                                     FileFormats format,
                                     int startPosition,
                                     float volumeScaling,
                                     int stopPosition,
                                     const CodecInst* codecInst) {
  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
               "Channel::StartPlayingFileLocally(fileNameUTF8[]=%s, loop=%d,"
               " format=%d, volumeScaling=%5.3f, startPosition=%d, "
               "stopPosition=%d)",
               fileName, loop, format, volumeScaling, startPosition,
               stopPosition);

  if (channel_state_.Get().output_file_playing) {
    _engineStatisticsPtr->SetLastError(
        VE_ALREADY_PLAYING, kTraceError,
        "StartPlayingFileLocally() is already playing");
    return -1;
  }

  {
    rtc::CritScope cs(&_fileCritSect);

    if (output_file_player_) {
      output_file_player_->RegisterModuleFileCallback(NULL);
      output_file_player_.reset();
    }

    output_file_player_ = FilePlayer::CreateFilePlayer(
        _outputFilePlayerId, (const FileFormats)format);

    if (!output_file_player_) {
      _engineStatisticsPtr->SetLastError(
          VE_INVALID_ARGUMENT, kTraceError,
          "StartPlayingFileLocally() filePlayer format is not correct");
      return -1;
    }

    const uint32_t notificationTime(0);

    if (output_file_player_->StartPlayingFile(
            fileName, loop, startPosition, volumeScaling, notificationTime,
            stopPosition, (const CodecInst*)codecInst) != 0) {
      _engineStatisticsPtr->SetLastError(
          VE_BAD_FILE, kTraceError,
          "StartPlayingFile() failed to start file playout");
      output_file_player_->StopPlayingFile();
      output_file_player_.reset();
      return -1;
    }
    output_file_player_->RegisterModuleFileCallback(this);
    channel_state_.SetOutputFilePlaying(true);
  }

  if (RegisterFilePlayingToMixer() != 0)
    return -1;

  return 0;
}

3、fileplayer 類創建media file用來解析文件並把文件存放入audiocoder.

混音時從neteq 得到解碼數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章